【问题标题】:Retrofit2 - response body null on success requestRetrofit2 - 成功请求的响应正文为空
【发布时间】:2016-05-17 11:18:28
【问题描述】:

Retrofit2 有问题。

当我调用我的网络服务时,即使成功,我的响应正文也是空的。

我尝试使用 RESTClient for Firefox 进行相同的调用,并且正文包含正确答案。

这是我的堆栈跟踪:

D/Call request: Request{method=POST, url=http://myNeo4jServer.com, tag=null}
D/Call request header: Authorization: Basic xxxxxx
                       Accept: application/json; charset=UTF-8
D/Response raw header: Server: nginx
                       Date: Tue, 17 May 2016 10:55:13 GMT
                       Content-Type: application/json
                       Content-Length: 21549
                       Connection: keep-alive
                       Access-Control-Allow-Origin: *
                       OkHttp-Sent-Millis: 1463482513167
                       OkHttp-Received-Millis: 1463482513354
D/Response raw: retrofit2.OkHttpCall$NoContentResponseBody@e6c7df
D/Response code: 200
D/Response body: null

如你所见:

  • Content-Length: 21549(我认为这也包括正文中的字符)

  • 响应码:200

  • 响应正文:空

我做错了什么?

编辑

我的界面:

public interface PhonebookContactAPI {
    @Headers({
        "Authorization: Basic xxxxxx",
        "Accept: application/json; charset=UTF-8",
        "Content-Type: application/json"
    })
    @POST("/db/data/transaction/commit")
    Call<ResponseBody> get(@Body RequestBody body);
}

我的要求:

String json = "{\"statements\": [{\"statement\": \"MATCH (n) RETURN n\"}]}";

Retrofit client = new Retrofit.Builder()
        .baseUrl(Globals.BASE_CLIENT_URL)
        .addConverterFactory(GsonConverterFactory.create())
        .build();

PhonebookContactAPI service = client.create(PhonebookContactAPI.class);

RequestBody body = RequestBody.create(okhttp3.MediaType.parse("application/json; charset=utf-8"), json);

Call<ResponseBody> call = service.get(body);
call.enqueue(new Callback<ResponseBody>() {
    @Override
    public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {

        Log.d("Call request", call.request().toString());
        Log.d("Call request header", call.request().headers().toString());

        Log.d("Response raw header", response.headers().toString());
        Log.d("Response raw", String.valueOf(response.raw().body()));
        Log.d("Response code", String.valueOf(response.code()));

        if(response.isSuccessful()) {
            Log.d("Response body", new Gson().toJson(response.body()));
        }

        else  {
            Log.d("Response errorBody", String.valueOf(response.errorBody()));
        }

    }

    @Override
    public void onFailure(Call<ResponseBody> call, Throwable t) {
        Log.d("onFailure", t.toString());
    }
});

【问题讨论】:

  • 向我们展示您拨打电话的代码可能会更有帮助。
  • @ishmaelMakitla 感谢您回答我。我刚刚更新了问题:)
  • 你能不能把Log.d("Response body", new Gson().toJson(response.body())); 改成Log.d("Response body", response.body().toString()); 之类的东西,让我们看看你得到的body 是否符合你的预期。如果它引发 NullPointerException,那么它可能表示响应确实为 null。
  • D/响应正文:okhttp3.ResponseBody$1@cda3c8a
  • @LucasPuerari 你能告诉我你是如何解决这个问题的

标签: android retrofit2


【解决方案1】:

由于您收到不为空的响应(基于您的最新命令)。我认为您需要按如下方式更改代码:

public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
        Log.d("Call request", call.request().toString());
        Log.d("Call request header", call.request().headers().toString());
        Log.d("Response raw header", response.headers().toString());
        Log.d("Response raw", String.valueOf(response.raw().body()));
        Log.d("Response code", String.valueOf(response.code()));

        if(response.isSuccessful()) {
            //the response-body is already parseable to your ResponseBody object
            ResponseBody responseBody = (ResponseBody) response.body();
            //you can do whatever with the response body now... 
            String responseBodyString= responseBody.string();
            Log.d("Response body", responseBodyString);
        }
        else  {
            Log.d("Response errorBody", String.valueOf(response.errorBody()));
        }
    }

请试一试,如果有帮助,请告诉我。

【讨论】:

  • 我认为这没什么改变 D/响应正文:okhttp3.ResponseBody$1@fde36f5
  • 请看代码中的注释,我只是表明你现在可以做任何事情,因为你有响应对象(它不为空)。能否请您包含 ReponseBody 类的代码?
  • ResponseBody 不是我的课。我已经从 okhttp3.ResponseBody 导入了
  • 好的,我已经编辑了答案 - 请尝试一下。基本上,我添加了String responseBodyString= responseBody.string(); 行,而是记录了结果字符串。
  • 总是同样的问题:(
【解决方案2】:

我发现:可能您的 API 响应对象映射错误。我遇到了同样的问题,在正确重新映射我的响应后,我的对象不再为空。

【讨论】:

    猜你喜欢
    • 2019-12-27
    • 1970-01-01
    • 2018-08-08
    • 1970-01-01
    • 2017-10-28
    • 2017-10-31
    • 2020-04-17
    • 1970-01-01
    • 2016-11-12
    相关资源
    最近更新 更多