2016-04-09 20 views
9

Tôi đang làm android, đang tìm cách thực hiện yêu cầu GET/POST http siêu cơ bản. Tôi tiếp tục nhận được một lỗi:Cách nhận phản hồi chuỗi từ Retrofit2?

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

Webservice:

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

sau đó trong java của tôi:

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

tôi theo nghĩa đen chỉ cố gắng để truy vấn jquery.org/projects với một GET yêu cầu và trả về Chuỗi mà nó phản hồi. Chuyện gì thế?

Nếu tôi cố gắng thực hiện một chuyển đổi tùy chỉnh (tôi đã tìm thấy một vài ví dụ trực tuyến), nó phàn nàn rằng tôi đã không thực hiện phương pháp trừu tượng chuyển đổi (F), mà không có ví dụ nào làm.

Cảm ơn.

Trả lời

4

Tôi xem qua thư viện trang bị thêm và nhận thấy rằng nó phân tích phản hồi theo loại lớp bên trong Call<T>. Vì vậy, bạn có hai lựa chọn: Thứ nhất: tạo một lớp theo phản hồi từ máy chủ.

Thứ hai: nhận phản hồi và tự xử lý nó (Không khuyến nghị Retrofit đã xử lý nó. Vậy tại sao bạn sử dụng Retrofit vì nó được thiết kế riêng cho công việc này). Dù sao thay vì Call<String> sử dụng Call<ResponseBody>Call<ResponseBody> signin = service.jquery(); sau này đặt sau

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

Contributor là gì? Nó không thể tìm thấy nó. –

+0

Tôi đã chỉnh sửa Nó là ResponseBody và thay đổi khác là body(). String() – uguboz

3

Bạn có thể thử như sau:

build.gradle file:

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

WebAPIService:

tập 210

Hoạt động:

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

tôi đã thử nghiệm với serivce tôi Web (ASP.Net WebAPI):

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

Android Logcat ra: 04-11 15:17:05.316 23097-23097/com.example.multipartretrofit I/AsyncRetrofit2: value1

Hy vọng nó sẽ giúp!

3

Để nhận phản hồi dưới dạng Chuỗi, bạn phải viết công cụ chuyển đổi và chuyển nó khi khởi tạo Retrofit.

Dưới đây là các bước.

Khởi tạo trang bị thêm.

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

lớp Chuyển đổi để chuyển đổi Retrofit's ResponseBody để 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; 
    } 
} 

Và sau khi thực hiện service.jquery();, signin sẽ chứa phản ứng JSON.

20

Với Retrofit2 thêm ScalarsConverterFactory vào Retrofit.Builder của bạn.

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

Để sử dụng ScalarsCoverter thêm phụ thuộc sau đây để xây dựng của bạn graddle

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

Để sử dụng API Gọi: ``

Call <String> ***** 

Mã Android:

.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

câu trả lời xuất sắc ... thêm một dòng .addConverterFactory (ScalarsConverterFactory.create()) đã giải quyết được vấn đề của tôi .... –

+0

tuyệt vời, nó hoạt động cho response.body(). toString() nhưng trong trường hợp response.errorBody(). toString() không hoạt động, xin hãy giúp tôi –

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

nếu bạn tìm thấy

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

sau đó đặt này trong RestAdapter bạn

   .setLogLevel(RestAdapter.LogLevel.FULL) 

cho Ví dụ:

RestAdapter restAdapter = new RestAdapter.Builder() 
      .setLogLevel(RestAdapter.LogLevel.FULL) 
      .setEndpoint(Root_url) 
      .build(); 
Các vấn đề liên quan