当前位置: 首页 > 知识库问答 >
问题:

Webservice不适用于Android改造,但适用于Postman和Swift/iOS,未经授权

公西星海
2023-03-14

“技术人员”之前的简报对改装并不陌生,但我遇到了这种奇怪的行为,我很难理解和修复。我有两个web服务,在Postman和iOS中都能正常工作,但只有一个在改装中工作,而另一个不工作,
为我辩护,我可以说我得到了(未经授权的)响应,这意味着我能够点击服务器并得到API开发者辩护的结果,他说它在邮递员和其他设备中工作,所以不是服务问题

如果有改装专家告诉我,为了得到这个错误,我背后可能在做什么改装?

技术的东西
谈到服务的类型,它包含授权承载令牌作为标头,每6小时到期一次,根本不包含参数(所以应该很容易,对吧?)和一个简单的urlhttp://hashchuna.nn-assets.com/api/locations
不幸的是,标头令牌不能与有效密钥共享,因为它会在任何人尝试之前过期,但无论如何,授权承载3d44626a55dbb024725984e0d37868336fd7e48a

我已经尝试了什么
我正在使用okhttp拦截添加授权头,以使用addHeader/头方法请求,url中没有空格,因为没有参数
在改造中得到401未经授权的错误?
Java:Android:改造-使用呼叫,响应{code=401,消息=未经授权}
https://github.com/square/retrofit/issues/1290
但没有一个有帮助

警告:现在要记住一个棘手的部分,过期的令牌必须给出401错误,这是意料之中的,但问题是即使对于新创建的令牌,我也会得到401,这是我的核心问题

日志

D/OkHttp: --> GET http://hashchuna.nn-assets.com/api/locations http/1.1
D/OkHttp: Authorization: Bearer 7c0d53de006b6de931f7d8747b22442354cecef9
D/OkHttp: --> END GET
D/OkHttp: <-- 401 Unauthorized http://hashchuna.nn-assets.com/api/locations (773ms)
D/OkHttp: Date: Mon, 20 Feb 2017 10:44:11 GMT
D/OkHttp: Server: Apache
D/OkHttp: X-Powered-By: PHP/7.0.15
D/OkHttp: Access-Control-Allow-Origin: *
D/OkHttp: Access-Control-Allow-Credentials: true
D/OkHttp: Access-Control-Max-Age: 1000
D/OkHttp: Access-Control-Allow-Headers: X-Requested-With, Content-Type, Origin, Authorization, Accept, Client-Security-Token, Accept-Encoding
D/OkHttp: Access-Control-Allow-Methods: POST, GET, OPTIONS, DELETE, PUT
D/OkHttp: Expires: Thu, 19 Nov 1981 08:52:00 GMT
D/OkHttp: Cache-Control: no-store, no-cache, must-revalidate
D/OkHttp: Pragma: no-cache
D/OkHttp: Set-Cookie: PHPSESSID=u477o8g0q387t92hms4nhc14n1; path=/
D/OkHttp: Vary: Authorization
D/OkHttp: X-Powered-By: PleskLin
D/OkHttp: Keep-Alive: timeout=5
D/OkHttp: Connection: Keep-Alive
D/OkHttp: Transfer-Encoding: chunked
D/OkHttp: Content-Type: application/json;charset=utf-8
D/OkHttp: <-- END HTTP

代码
拦截

Request request = chain
                        .request()
                        .newBuilder()
                        //.header("Authorization","Bearer "+ SharedPrefsUtils.getSPinstance().getAccessToken(context))
                        .addHeader("Authorization","Bearer 1ed6b7c1839e02bbf7a1b4a8dbca84d23127c68e")
                        //.addHeader("cache-control", "no-cache")
                        //.cacheControl(CacheControl.FORCE_NETWORK)
                        .build();

改造实例

private Api getApiInstance(Context context) {
        HttpLoggingInterceptor logInter = new HttpLoggingInterceptor();
        logInter.setLevel(HttpLoggingInterceptor.Level.BODY);
        OkHttpClient mIntercepter = new OkHttpClient.Builder()
                .addInterceptor(new RequestResponseInterseptor(context))
                .addInterceptor(logInter)
                .build();

        Retrofit retrofitInstance = new Retrofit.Builder()
                //.addConverterFactory(new NullOnEmptyConverterFactory())
                .addConverterFactory(GsonConverterFactory.create())
                .baseUrl(BASE_URL)
                .client(mIntercepter)
                .build();
        return retrofitInstance.create(Api.class);
    }

共有3个答案

西门嘉石
2023-03-14

不幸的是,在我的案例中,@Ujju的解决方案中列出的建议都没有奏效(即“Cookie”标头和CookieJar都没有应用)。唯一帮助我的是将addInterceptor替换为addNetworkInterceptor,一切都开始工作。

郑俊材
2023-03-14

我认为您正在覆盖为您添加的其他标题,导致您的API不关心您的授权标题。下面的代码将向现有标头添加标头,而不是覆盖它们。

    OkHttpClient mIntercepter = new OkHttpClient.Builder()
            ...
            .addInterceptor(new Interceptor() {
                 @Override 
                 public Response intercept(Chain chain) throws IOException {
                        Request request = chain.request().newBuilder().addHeader("Authorization", "Bearer " + "1ed6b7c1839e02bbf7a1b4a8dbca84d23127c68e").build();
                        return chain.proceed(request);
            })
            ...
            .build();

这些头的格式在这里是正确的,键应该是授权,值应该是承载1ed6b7c1839e02bbf7a1b4a8dbca84d23127c68e(在您的情况下)。

漆雕伟志
2023-03-14

解决方案(它的COOKIE)
由于一些提示,服务不兼容的实际原因是,据说POSTMAN和iOS客户端存储和重用COOKIE本身,当提出请求时,无需任何显式处理,Postman中的Cookie可以使用Postman Intercepter进行测试,但无法编辑,因为chrome不允许插件编辑cookie

但是,除非指定,否则Retrofit/OkHttp会认为它被禁用(可能出于安全原因),
Cookie要么添加在Interseptor中,作为标头addHeader(“Cookie”、“KEY-VALUE”)

使用CookieJar添加到

OkHttpClient mIntercepter = new OkHttpClient.Builder()
                .cookieJar(mCookieJar)
                .addInterceptor(new RequestResponseInterseptor(context))
                .addInterceptor(logInter)
                .build();

根据您的需要和cookie类型

 类似资料:
  • 我能够成功地打电话给邮递员: /mfp/api/az/v1/token和 /mfpadmin/management-apis/2.0/runtimes/mfp/applications 我正在获取从/mfp/api/az/v1/token接收的承载令牌,并将其添加到/mfp/applications的授权标头中。 我收到了来自两者的200个响应,并从每个API中获取了预期的信息。 然后,我选择从P

  • 关于redash,我有一个问题。这是请求。在上,它工作得很好。查询示例: 但在axios上,它抛出: 网络错误 并在控制台上写: 访问XMLHttpRequest at

  • 我一直在发疯,想弄明白为什么最终的android改造没有发送帖子。这就是我所做的。在Laravel中,我设置了模型controller,更改了VerifyCsrfToken以允许api。然后设置路由web和api。所有这些都是通过邮递员测试的,而且都是有效的,但当我尝试通过android发布时,代码失败了。 这是我给Laravel的路线 网状物php 应用程序编程接口。php Androidapi

  • 问题内容: 嗨,我只是简单地尝试在www.example.com上获取h1标签,该标签显示为“ Example Domain”。该代码适用于http://www.example.com,但不适用于https://www.exmaple.com。我该如何解决这个问题?谢谢 问题答案: PhantomJSDriver不支持(所有)DesiredCapabilities。 你会需要: 记录在这里:htt

  • 所以我使用这种方法写入文件,它在windows上运行完全正常,但在mac上运行时,它会创建文件,但它们是空的。 我知道数据是正确的,因为它打印正确。感谢您的任何帮助,这真的让我绊倒了。

  • 当我在Android手机上调试应用程序时,我绝对没有遇到任何错误,但在AVD上,我一开始就得到了一个NullPointerException()。我的Android设备在22 API的Lollipop(5.1.1)上运行,我的AVD在28 API的Pie(9.0)上运行。我在gradle中将最小SDK设置为21,编译SDK设置为28。 这是错误: E/AndroidRuntime:致命异常:主进程