【问题标题】:When i use Retrofit2.0 with POST , body is null , but the reponse code is 5xx?当我将 Retrofit 2.0 与 POST 一起使用时,body 为 null,但响应代码为 5xx?
【发布时间】:2016-12-30 01:49:36
【问题描述】:
 Gson gson = new Gson();
    String json = gson.toJson(account);
    System.out.println(json);
    RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), json);
    p2PApi.createDepositAcct(body).enqueue(new Callback<Create>() {
        @Override
        public void onResponse(Call<Create> call, Response<Create> response) {
            try {

                System.out.println(response.code());
                System.out.println(response.errorBody().string());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onFailure(Call<Create> call, Throwable t) {

        }
    });

这是我的代码,响应成功,但是 response.code()=518 和 响应消息在 response.errorBody() 中,reponse.body() 为空。

那为什么要回复 518 呢?

518 是什么意思?

【问题讨论】:

    标签: java android http retrofit2


    【解决方案1】:

    正如您从 Retrofit API 文档中看到的那样

    https://square.github.io/retrofit/2.x/retrofit/

    public T body()
    

    成功响应的反序列化响应正文。

    什么是成功响应?

    public boolean isSuccessful()
    

    如果 code() 在 [200..300) 范围内,则返回 true。

    以及errorbody方法说明

    public okhttp3.ResponseBody errorBody()
    

    不成功响应的原始响应正文。

    响应不成功表示代码不在(200-300)范围内,即isSuccessful()函数中的描述。

    如果您的代码是 518,则消息肯定在 errorbody() 中

    关于HTTP状态码的信息,一般可以参考这里 https://en.wikipedia.org/wiki/List_of_HTTP_status_codes

    5xx 状态码是服务器错误,虽然我不知道究竟是什么错误是 518,但通常应该是服务器端错误。

    正如 RFC7231,“6. 响应状态代码”所述。

    status-code 元素是一个三位整数代码 试图理解和满足请求的结果。

    HTTP 状态码是可扩展的。 HTTP 客户端不需要 了解所有注册状态代码的含义,尽管这样 理解显然是可取的。但是,客户必须 了解任何状态代码的类别,如第一个所示 digit,并将无法识别的状态代码视为等效于 该类的 x00 状态代码,除了 a 收件人不得缓存具有无法识别状态代码的响应。

    例如,如果一个无法识别的状态码 471 被 客户,客户可以假设它有问题 请求并将响应视为收到 400 (Bad 请求)状态码。响应消息通常包含一个 解释状态的表示。

    通常情况下,状态码是为一些常见用途预定义的,并且可以扩展。这意味着可能会有一些像 518 这样的状态代码,但如果您搜索网络,则没有确切的含义(因为它是自定义的 http 状态代码)。但是你可以把它当作服务器端错误之一(5xx错误)

    【讨论】:

    • 是的,你是对的, isSuccessful() = false ,响应消息在 errorbody() 中,但是服务器中的响应消息内容表示成功,这对我来说真的很必要,所以我真的很困惑。
    • 你的意思是518码在你的服务器上成功了吗?还是518的response message(json)表示服务器成功?
    • 我不知道518代码是什么意思,虽然Retrofit2 isSuccessful() = false,虽然消息属于reponse.errorbody(),但是message(json)确实是我需要的。总之,所有的json消息都表示成功,服务器应该回复200,但现在代码是518。对不起我的英语很差...希望你能理解
    • HTTP 状态码和响应消息不同,但客户端每次都会收到。 http状态码一般表示请求的含义(如200404)。并且响应消息是基于服务器端的。比如每次获取数据成功,都会得到json数据(响应)和code 200(OK)。然后你发现没有自定义响应的数据,例如{data:"Cannot found any staff name by using staffID"}(响应)和代码 404(未找到)。 Http状态码告诉了请求的大致含义,但详细含义在响应中。
    猜你喜欢
    • 2020-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-22
    • 2015-09-30
    • 1970-01-01
    • 2019-08-23
    • 1970-01-01
    相关资源
    最近更新 更多