当我期待 Bad request(400)响应代码和错误响应正文时,我得到了成功的响应代码和错误的响应主体,它对应于之前的请求。每次由于服务器不可用而导致连接尝试失败后请求调用入队时,都会发生这种情况。
我在 OkHttp 3.9.1 中使用 Retrofit 2.3.0 版本。
我正在尝试的方案如下:
尝试从不可用的服务器获取OAuth客户端凭据。这导致按预期调用我的Retrofit回调的onFailure()
方法。
OkHttp: --> POST <my_server_endpoint>
OkHttp: Content-Type: application/json; charset=UTF-8
OkHttp: Content-Length: 102
OkHttp: {"clientName":"client_name","grantType":"password refresh_token","owner":"a4yhyh","tokenScope":"production"}
OkHttp: --> END POST (102-byte body)
OkHttp: - <-- HTTP FAILED: java.net.SocketTimeoutException: timeout
BaseCallback: onFailure received. java.net.SocketTimeoutException: timeout
运行服务器并使其可用。
尝试再次获取客户端凭据,但针对不同的所有者。
OkHttp - --> POST <my_server_endpoint>
OkHttp - Content-Type: application/json; charset=UTF-8
OkHttp - Content-Length: 108
OkHttp - {"clientName":"client_name","grantType":"password refresh_token","owner":"uvuguvuv","tokenScope":"production"}
OkHttp - --> END POST (108-byte body)
OkHttp - <-- 201 Created <my_server_endpoint> (1984ms)
OkHttp - Date: Mon, 05 Feb 2018 14:13:47 GMT
OkHttp - Content-Type: application/octet-stream
OkHttp - Content-Length: 144
OkHttp - {"callback_url":null,"client_secret":"nn59eTalNunqzc_Y6AnuNgvW1EUa","client_name":"a4yhyh_client_name","client_id":"III4ZSLyN4f2AJ_S683QGjepE94a"}
OkHttp - <-- END HTTP (144-byte body)
尝试使用从先前响应中收到的客户端凭据获取访问令牌。
OkHttp - --> POST <my_server_endpoint>
OkHttp - Content-Type: application/x-www-form-urlencoded
OkHttp - Content-Length: 148
OkHttp - client_id=III4ZSLyN4f2AJ_S683QGjepE94a&client_secret=nn59eTalNunqzc_Y6AnuNgvW1EUa&grant_type=password&scope=default&username=uvuguvuv&password=dgghj
OkHttp - --> END POST (148-byte body)
OkHttp - <-- 201 Created <my_server_endpoint> (6ms)
OkHttp - Date: Mon, 05 Feb 2018 14:13:47 GMT
OkHttp - Content-Type: application/octet-stream
OkHttp - Content-Length: 146
OkHttp - {"callback_url":null,"client_secret":"3ZelXujLNESZffftAjOlZm2H48Aa","client_name":"uvuguvuv_client_name","client_id":"VZHAQOfIuUkhb1JuyPLhNKPubMwa"}
OkHttp - <-- END HTTP (146-byte body)
这是我期望400响应代码,因为我在访问令牌请求中提供随机用户名和密码,但我获得201响应代码和响应主体,对应于先前的客户端凭据请求。
我在构建OkHttp客户端时尝试设置retryOnConnectionFailure(false)
,并在我的回调的onFailure()
实现中取消了调用,但似乎没有任何效果。
我已检查过服务器端,并正确返回400个访问令牌请求的响应代码。
有人遇到过这个问题吗?任何想法如何克服它? 提前谢谢。
修改:我做了一些研究,发现我的问题类似于以下问题: https://github.com/square/okhttp/issues/2394 - 虽然有人说这个问题已经解决,但仍有一些人面临问题(见 https://github.com/OpenFeign/feign/issues/401和https://github.com/square/okhttp/issues/3830)