Web服务无法在Android Retrofit中使用,但可以在Postman和Swift/iOS中使用,未经授权就获得401 [英] Webservice not working in Android Retrofit , but works in Postman and Swift / iOS, Getting 401 Unauthorized

查看:179
本文介绍了Web服务无法在Android Retrofit中使用,但可以在Postman和Swift/iOS中使用,未经授权就获得401的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在技术性东西"之前偷东西
使用Retrofit并不陌生,但是遇到了这种奇怪的行为,我很难理解和解决, 我有两个Web服务,都可以在Postman和iOS中正常工作,但是只有一个可以在Retrofit中工作,而另一个在
为了辩护,我可以说我正在收到(未经授权)响应,这意味着我能够访问服务器并获得结果
在API开发人员的辩护中,他说它可以在Postman和其他设备上使用,因此不会出现服务问题

BRIEFING BEFORE 'technical stuff'
Not new to working with Retrofit but came across this strange behaviour which I am having very hard time to understand and fix, I have two web service, both work fine as expected in Postman and iOS but only one works in Retrofit and not the other,
In my defence I can say I am getting (Unauthorized) response,which means I was able to hit the server and get a result
In API developer's defence he says it works in Postman and other devices so not a service issue

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

If any Retrofit expert out there tell me what retrofit may be doing behind my back in order to get this error?

技术资料
谈论服务的类型,它包含 Authorization Bearer令牌 作为标头,该标头每6小时到期一次,并且完全不包含任何参数(所以应该很容易,对吧?),一个简单的网址 http://hashchuna.nn-assets.com/api/locations
不幸的是,标头令牌不能与有效密钥共享,因为它在任何人都可以尝试之前就已过期,但是无论如何,这里都是授权载体3d44626a55dbb024725984e0d37868336fd7e48a

TECHNICAL STUFF
Talking about the type of service , It contains Authorization Bearer token as header which expires every 6 hours and contains no params at all (so it should be easy, right ?) and a simple url http://hashchuna.nn-assets.com/api/locations
Unfortunately the header token cant be shared with valid key, cos it'l be expired before anyone can try it, but here it's anyway Authorization Bearer 3d44626a55dbb024725984e0d37868336fd7e48a

我尝试过的事情
我正在使用okhttp拦截来添加授权标头,以同时使用 addHeader/header 方法进行请求,URL cos中没有空格,也没有参数
在改装中遇到401未经授权的错误?
Java:Android:改造-使用Call but,Response { code = 401,message = unauthorized}
https://github.com/square/retrofit/issues/1290
但是没有一个人帮助

WHAT I'VE TRIED
I am using okhttp intercept to add Authorization Header to request using both addHeader/header method, no spaces in the url cos there r no params
Getting 401 unauthorized error in retrofit?
Java: Android: Retrofit - using Call but, Response{code = 401,message=unauthorized}
https://github.com/square/retrofit/issues/1290
But non of them helped

警告
现在要记住的棘手部分是,令牌过期时必须给出预期的401错误,但问题甚至是对于刚创建的令牌,我也遇到了401问题,这是我的核心问题

WARNING
Now the tricky part to keep in mind, the token when expired must give 401 error which is expected, but the problem is even for freshly created token I get 401 , which is my core problem

日志

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);
    }

推荐答案

解决方案(其COOKIE)
多亏了一些技巧,服务不兼容的真正原因是,假设POSTMAN和iOS客户端仅在发出请求时无需进行显式处理,即可单独存储和重用COOKIE,可以使用邮递员拦截器,但由于chrome不允许,因此无法进行编辑通过插件编辑Cookie

SOLUTION (its the COOKIE)
Thanks to some of the tips, the actual reason for Incompatibility of service is , Supposedly POSTMAN and iOS client store and reuse COOKIE all by itself when requests are made without any need for explicit handling, Cookie in Postman can be tested using Postman Intercepter ,but cant be edited because chrome does not allow editing cookie by plugins

但是Retrofit/OkHttp除非已指定,否则将被视为已禁用(可能出于安全原因),
Cookie被添加到Interseptor内部作为标头addHeader("Cookie","KEY-VALUE")
之一 或
使用cookieJar添加到

However Retrofit/OkHttp unless specified will consider it disabled(for security reason maybe) ,
Cookie is added either inside Interseptor as one of the header addHeader("Cookie","KEY-VALUE")
or
Use cookieJar to add into

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

根据您的需要和cookie类型

based on your need and cookie type

这篇关于Web服务无法在Android Retrofit中使用,但可以在Postman和Swift/iOS中使用,未经授权就获得401的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆