2015-10-22 17 views
33

私のAPI RESTから生のHTTPレスポンスを取得したいと思います。私は、このインターフェイスを試してみました:Retrofitでraw HTTPレスポンスを取得

@POST("/login") 
@FormUrlEncoded 
Call<retrofit.Response> login(@Field("username") String login, @Field("password") String pass, 
        @Field("appName") String appName, @Field("appKey") String appKey); 

しかし、私は得る:

java.lang.IllegalArgumentExceptionがを:

Api.login方法について retrofit.Call のコールアダプタを作成することができません。

このようにしてRetrofitを作成します。

Retrofit.Builder retrofitBuilder = new Retrofit.Builder(); 
retrofitBuilder.addConverterFactory(JacksonConverterFactory.create()); 
Retrofit retrofitAdapter = retrofitBuilder.baseUrl(baseUrl).build(); 
return retrofitAdapter.create(apiClass); 

答えて

48

生の応答にアクセスするには、通話タイプとしてokhttpのResponseBodyを使用します。あなたのコールバックで

Call<ResponseBody> login(...) 

、あなたは応答のcode方法で応答コードを確認することができます。コールバックでは常に実際の戻り値の型でパラメータ化されたResponseが返されるため、これは任意の2戻り値の型に適用されます。同期呼び出しのための

Call<ResponseBody> myCall = myApi.login(...) 
myCall.enqueue(new Callback<ResponseBody>() { 
    @Override 
    public void onResponse(Response<ResponseBody> response, Retrofit retrofit) { 
     // access response code with response.code() 
     // access string of the response with response.body().string() 
    } 

    @Override 
    public void onFailure(Throwable t) { 
     t.printStackTrace(); 
    } 
}); 

- - 非同期について

Response<ResponseBody> response = myCall.execute(); 
System.out.println("response code" + response.code()); 
+0

しかし、これはレスポンスボディで、このように。 httpレスポンスコードをチェックしたいのですが? –

+1

あなたは常にhttpコードをチェックできる 'Response'オブジェクトを取得します。更新された回答をご覧ください。 – iagreen

+0

ありがとうございます。要求オブジェクトを非同期にするための方法はありますか? –

19

あなたはInterceptorsを使用してダウン生のJSONレスポンスボディに、ヘッダ、レスポンスコードについての情報を得ることができます。あなたはカスタムインターセプタを書くことができますが、Squareの独自のLogging Interceptorを使うことを好みます。これは、Maven中心部で利用可能です。ここで

compile 'com.squareup.okhttp3:logging-interceptor:3.5.0' 

HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); 
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); 
OkHttpClient client = new OkHttpClient.Builder() 
       .addInterceptor(interceptor).build(); 

ログレベルの体は体応答にヘッダを出力しますそれを使用する方法です。今、そして、あなたのレトロフィットで

Retrofit retrofit = new Retrofit.Builder() 
      .client(client)    
      .baseUrl("https://yourapi.com/api/") 
      .build(); 

、ログイン猫を開くと、あなたは生のHTTPレスポンスが表示されます。

注意!

プロダクションでインターセプタを削除する(またはログレベルをNONEに変更する)ことを忘れないでください!さもなければ、人々はLog Catであなたの要求と応答を見ることができます。

+4

サー!私のデッドラインを保存しました^^ – AnixPasBesoin

+0

私のコードに何が間違っているのか教えてください。それがうまくいけばhttp://imgur.com/a/yKvfS – zihadrizkyef

+0

@zihadrizkyef:あなたのログレベルをLogCatの "Verbose"に入れてください – thenaoh

0

私は同じ問題を抱えていましたが、別の解決方法がありました。私は要求を受け取り、OkHttp3Clientで送信しました。

//raw text 
Request request = call.clone().request(); 
OkHttpClient client = new OkHttpClient(); 
okhttp3.Response test = client.newCall(request).execute(); 
System.out.println(test.body().string()); 

ソース:http://robinhenniges.com/de/retrofit-2-raw-response

関連する問題