2016-04-09 9 views
9

मैं एंड्रॉइड कर रहा हूं, एक सुपर मूल http GET/POST अनुरोध करने का तरीका ढूंढ रहा हूं। मैं एक त्रुटि प्राप्त हो रही:रेट्रोफिट 2 से स्ट्रिंग प्रतिक्रिया कैसे प्राप्त करें?

java.lang.IllegalArgumentException: Unable to create converter for class java.lang.String 

वेब सेवा:

public interface WebService { 
    @GET("/projects") 
    Call<String> jquery(); 
} 
तो

मेरी जावा में:

Retrofit retrofit = new Retrofit.Builder() 
     .baseUrl("https://jquery.org") 
     // .addConverterFactory(GsonConverterFactory.create()) 
     .build(); 

    WebService service = retrofit.create(WebService.class); 
    Call<String> signin = service.jquery(); 

    Toast.makeText(this, signin.toString(), Toast.LENGTH_LONG).show(); 

मैं सचमुच सिर्फ एक प्राप्त साथ jquery.org/projects क्वेरी करने के लिए कोशिश कर रहा हूँ उस स्ट्रिंग का अनुरोध करें और उसे वापस लौटाएं जिसका जवाब है। गलत क्या है?

यदि मैं एक कस्टम कनवर्टर को लागू करने का प्रयास करता हूं (मुझे कुछ उदाहरण ऑनलाइन मिलते हैं) तो यह शिकायत करता है कि मैंने अमूर्त विधि कन्वर्ट (एफ) को लागू नहीं किया है, जिसमें से कोई भी उदाहरण नहीं करता है।

धन्यवाद।

उत्तर

4

मैं रेट्रोफिट लाइब्रेरी पर एक नज़र डालता हूं और देखा कि यह Call<T> के अंदर टाइप क्लास के अनुसार प्रतिक्रिया पार्स करता है। तो आपके पास दो विकल्प हैं: पहला: सर्वर से प्रतिक्रिया के अनुसार कक्षा बनाएं।

दूसरा: प्रतिक्रिया प्राप्त करें और इसे स्वयं संभाल लें (अनुशंसित नहीं है रेट्रोफिट पहले से ही इसे संभालता है। तो आप इस नौकरी के लिए रेट्रोफिट का उपयोग क्यों करते हैं)। वैसे भी Call<String> उपयोग Call<ResponseBody> और Call<ResponseBody> signin = service.jquery(); इस के बाद के बजाय डाल निम्नलिखित

call.enqueue(new Callback<ResponseBody>() { 
    @Override 
    public void onResponse(Response<ResponseBody> response, Retrofit retrofit) { 
    // handle success 
    String result = response.body().string(); 

    } 

    @Override 
    public void onFailure(Throwable t) { 
    // handle failure 
    } 
}); 
+0

योगदानकर्ता क्या है? यह नहीं मिल रहा है। –

+0

मैंने इसे संपादित किया है यह प्रतिक्रिया है और अन्य परिवर्तन शरीर() है। स्ट्रिंग() – uguboz

3

आप निम्न की कोशिश कर सकते हैं:

build.gradle फ़ाइल:

dependencies { 
    ... 
    compile 'com.squareup.retrofit2:retrofit:2.0.1' 
    ... 
} 

WebAPIService:

@GET("/api/values") 
Call<String> getValues(); 

गतिविधि फ़ाइल:

public class ValuesController : ApiController 
{ 
     public string Get() 
     { 
      return "value1"; 
     } 
} 

एंड्रॉयड Logcat बाहर: 04-11 15:17:05.316 23097-23097/com.example.multipartretrofit I/AsyncRetrofit2: value1

आशा है कि यह मदद करता है

 Retrofit retrofit = new Retrofit.Builder() 
       .baseUrl(API_URL_BASE)      
       .build(); 

     WebAPIService service = retrofit.create(WebAPIService.class); 

     Call<String> stringCall = service.getValues(); 
     stringCall.enqueue(new Callback<String>() { 
      @Override 
      public void onResponse(Call<String> call, Response<String> response) { 
       Log.i(LOG_TAG, response.body()); 
      } 

      @Override 
      public void onFailure(Call<String> call, Throwable t) { 
       Log.e(LOG_TAG, t.getMessage()); 
      } 
     }); 

मैं अपने वेब serivce (ASP.Net वेबएपीआई) के साथ परीक्षण किया है!

3

स्ट्रिंग के रूप में प्रतिक्रिया प्राप्त करने के लिए, आपको कनवर्टर लिखना होगा और Retrofit प्रारंभ करते समय इसे पास करना होगा।

यहां दिए गए कदम हैं।

रेट्रोफिट प्रारंभ करना।String

public class ToStringConverterFactory extends Converter.Factory { 
    private static final MediaType MEDIA_TYPE = MediaType.parse("text/plain"); 


    @Override 
    public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, 
                  Retrofit retrofit) { 
     if (String.class.equals(type)) { 
      return new Converter<ResponseBody, String>() { 
       @Override 
       public String convert(ResponseBody value) throws IOException 
       { 
        return value.string(); 
       } 
      }; 
     } 
     return null; 
    } 

    @Override 
    public Converter<?, RequestBody> requestBodyConverter(Type type, Annotation[] parameterAnnotations, 
                  Annotation[] methodAnnotations, Retrofit retrofit) { 

     if (String.class.equals(type)) { 
      return new Converter<String, RequestBody>() { 
       @Override 
       public RequestBody convert(String value) throws IOException { 
        return RequestBody.create(MEDIA_TYPE, value); 
       } 
      }; 
     } 
     return null; 
    } 
} 

करने के लिए Retrofit's ResponseBody परिवर्तित करने के लिए और क्रियान्वित करने service.jquery();, signin JSON उत्तर में शामिल होंगे के बाद

Retrofit retrofit = new Retrofit.Builder() 
       .baseUrl(API_URL_BASE) 
       .addConverterFactory(new ToStringConverterFactory()) 
       .build(); 
     return retrofit.create(serviceClass); 

कनवर्टर वर्ग।

20

रेट्रोफिट 2 के साथ अपने रेट्रोफिट.बिल्डर को स्केलर्स कनवर्टर फैक्टरी जोड़ें।

adapterBuilder = new Retrofit.Builder() 
       .addConverterFactory(ScalarsConverterFactory.create()) 
       .addConverterFactory(GsonConverterFactory.create()); 

ScalarsCoverter उपयोग करने के लिए अपने निर्माण graddle

compile 'com.squareup.retrofit2:converter-scalars:2.1.0' 
compile 'com.squareup.retrofit2:retrofit:2.1.0' //Adding Retrofit2 

के लिए निम्न निर्भरता जोड़ने API कॉल उपयोग के लिए:

Call <String> ***** 

एंड्रॉयड कोड ``:

.enqueue(new Callback<String>() { 
    @Override 
    public void onResponse(Call<String> call, Response<String> response) { 
     Log.i("Response", response.body().toString()); 
     //Toast.makeText() 
     if (response.isSuccessful()){ 
      if (response.body() != null){ 
       Log.i("onSuccess", response.body().toString()); 
      }else{ 
       Log.i("onEmptyResponse", "Returned empty response");//Toast.makeText(getContext(),"Nothing returned",Toast.LENGTH_LONG).show(); 
      } 
     } 
+1

उत्कृष्ट उत्तर ... .addConverterFactory (ScalarsConverterFactory.create()) की एक पंक्ति जोड़कर मेरी समस्या हल हो गई .... –

+0

बढ़िया, इसके लिए काम करना respond.body()। toString()। लेकिन प्रतिक्रिया के मामले में .errorBody()। toString() काम नहीं कर रहा है, कृपया मेरी मदद करें –

0
String body = new String(((TypedByteArray) response.getBody()).getBytes()); 

अगर आप पाया

java.lang.ClassCastException: retrofit.client.UrlConnectionClient$TypedInputStream cannot be cast to retrofit.mime.TypedByteArray 

फिर अपने RestAdapter

   .setLogLevel(RestAdapter.LogLevel.FULL) 
उदाहरण के लिए

में रखते:

RestAdapter restAdapter = new RestAdapter.Builder() 
      .setLogLevel(RestAdapter.LogLevel.FULL) 
      .setEndpoint(Root_url) 
      .build(); 
संबंधित मुद्दे