2016-05-17 6 views
1

Retrofit2に問題があります。Retrofit2 - レスポンスボディヌル(成功要求時)

成功した場合でも、私のwebserviceに電話をかけると、私の応答の本文はnullになります。

Firefox用のRESTClientで同じ呼び出しを行いましたが、本文に正しい答えが含まれていました。あなたが見ることができるように

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: [email protected] 
D/Response code: 200 
D/Response body: null 

は、これは私のスタックトレースです

  • のContent-Length:21549(私は考えることもカウント体の文字)

  • レスポンスコード:200

  • レスポンスボディ:null

私が間違って何をしているのですか?

編集

マイインタフェース:

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()); 
    } 
}); 
+0

また、私たちにあなたが呼び出しを行っているコードを表示する方が役に立つかもしれません。 – ishmaelMakitla

+0

@ishmaelMakitla私に答えてくれてありがとう。私はちょうど質問を更新しました: –

+0

'Log.d(" Response body "、new Gson()。toJson(response.body()));' "、response.body()。toString());'あなたが期待どおりに体を取得するかどうかを見てみましょう。 NullPointerExceptionが発生した場合は、応答が実際にnullであることを示す可能性があります。 – ishmaelMakitla

答えて

0

あなたがnullでない応答を取得しているので、(最新のコマンドに基づいて)。

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

これが役立つかどうか試してみてください。次のようにコードを変更する必要があります。

+0

私はそれが何も変わらないと思います。 D /レスポンスボディ:[email protected] –

+0

コード内のコメントを見てください。応答オブジェクト(これはnullではありません)を持つようになりました。あなたはReponseBodyクラスのコードを含めてください。 – ishmaelMakitla

+0

ResponseBodyが私のクラスではありません。私はokhttp3.ResponseBodyからインポートしました –

関連する問題