2015-10-22 10 views
33

के साथ कच्ची HTTP प्रतिक्रिया प्राप्त करें मैं अपने एपीआई आरईएसटी से कच्ची 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 विधि के साथ जवाब कोड की जांच कर सकते हैं। यह किसी भी रेट्रोफिट 2 रिटर्न प्रकार पर लागू होता है, क्योंकि आपके कॉलबैक को आपके वास्तविक रिटर्न प्रकार के साथ पैरामीटरकृत Response मिलता है।

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 कोड देख सकते हैं। अद्यतन उत्तर देखें। – iagreen

+0

धन्यवाद। प्रतिक्रिया ऑब्जेक्ट अनुरोध अतुल्यकालिक प्राप्त करने का कोई तरीका है? –

19

आप Interceptors का उपयोग करके हेडर, प्रतिक्रिया कोड के बारे में जानकारी प्राप्त कर सकते हैं, कच्चे json प्रतिक्रिया शरीर के लिए नीचे। आप अपने कस्टम इंटरसेप्टर लिख सकते हैं लेकिन मैं स्क्वायर के अपने लॉगिंग इंटरसेप्टर का उपयोग करना पसंद करता हूं। यह मेवेन केंद्रीय पर उपलब्ध है।

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 प्रतिक्रिया दिखाई देगी।

सावधानी!

उत्पादन में इंटरसेप्टर (या लॉगिंग स्तर को बदलने के लिए) को हटाने के लिए मत भूलना! अन्यथा लोग लॉग बिल्ली पर आपका अनुरोध और प्रतिक्रिया देख पाएंगे।

+4

महोदय! आपने मेरी समय सीमा ^^ – AnixPasBesoin

+0

सहेजी है क्या आप मुझे बता सकते हैं कि मेरे कोड में क्या गलत है? क्योंकि यह काम नहीं करता है http://imgur.com/a/yKvfS – zihadrizkyef

+0

@zihadrizkyef: बस मामले में, अपने लॉग स्तर पर अपने वर्क स्तर को "वर्बोज़" पर रखें – 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