连接尝试失败后,OkHttp返回错误的响应代码和正文

时间:2018-02-06 11:18:26

标签: android retrofit retrofit2 okhttp okhttp3

当我期待 Bad request(400)响应代码和错误响应正文时,我得到了成功的响应代码和错误的响应主体,它对应于之前的请求。每次由于服务器不可用而导致连接尝试失败后请求调用入队时,都会发生这种情况。

我在 OkHttp 3.9.1 中使用 Retrofit 2.3.0 版本。

我正在尝试的方案如下:

  1. 尝试从不可用的服务器获取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
    
  2. 运行服务器并使其可用。

  3. 尝试再次获取客户端凭据,但针对不同的所有者。

    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)
    
  4. 尝试使用从先前响应中收到的客户端凭据获取访问令牌。

    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)
    
  5. 这是我期望400响应代码,因为我在访问令牌请求中提供随机用户名和密码,但我获得201响应代码和响应主体,对应于先前的客户端凭据请求。

    我在构建OkHttp客户端时尝试设置retryOnConnectionFailure(false),并在我的回调的onFailure()实现中取消了调用,但似乎没有任何效果。

    我已检查过服务器端,并正确返回400个访问令牌请求的响应代码。

    有人遇到过这个问题吗?任何想法如何克服它? 提前谢谢。

    修改:我做了一些研究,发现我的问题类似于以下问题: https://github.com/square/okhttp/issues/2394 - 虽然有人说这个问题已经解决,但仍有一些人面临问题(见 https://github.com/OpenFeign/feign/issues/401https://github.com/square/okhttp/issues/3830

0 个答案:

没有答案