2016-02-20 22 views
2

我使用retrofit1旧式从retrofit2

@GET("/loginUser") 
    public Call<Response> login(
      @Query("email") String email, 
      @Query("password") String password, 
      Callback<Response> callback); 

现在我不想让“用户”级,但是我希望得到一个String响应获取字符串响应体。

以前我们使用的是“响应”但是,现在在retrofit2没有反应,

我怎样才能串响应,或从服务器,而不使用任何JSON解析全身反应?

回答

14

创建该类

import java.io.IOException; 
import java.lang.annotation.Annotation; 
import java.lang.reflect.Type; 

import okhttp3.MediaType; 
import okhttp3.RequestBody; 
import okhttp3.ResponseBody; 
import retrofit2.Converter; 
import retrofit2.Retrofit; 

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[] annotations, 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 retrofit = new Retrofit.Builder() 
         .addConverterFactory(new ToStringConverterFactory()) 
         .build(); 

编辑使用它: 你必须把它定义为

@GET("/loginUser") 
    public Call<String> login(
      @Query("email") String email, 
      @Query("password") String password); 

没有支持retrofit2所以回调你必须删除它。为了使异步的,你所要做的

Call<String> call = service.login(username, password); 
call.enqueue(new Callback<String>() {} 

编辑上面的代码是为retrofit2测试3.对于改装:2.1.0,你必须创建ToStringConverterFactory为 -

import java.io.IOException; 
import java.lang.annotation.Annotation; 
import java.lang.reflect.Type; 

import okhttp3.MediaType; 
import okhttp3.RequestBody; 
import okhttp3.ResponseBody; 
import retrofit2.Converter; 
import retrofit2.Retrofit; 

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

要知道: Incase你想要有多个转换器(例如上面显示的一个字符串转换器,也是一个GSON转换器):
确保先指定专用转换器(例如字符串转换器)和通用转换器(li ke Gson)最后!

转换器将按照它们添加的顺序被调用,如果转换器消耗了响应,则不会调用以下转换器。

+0

和我将如何更改代码我张贴 –

+0

也在第二功能覆盖的网址是错误 –

+0

错误检查您的导入。所有的进口应该是从改造2和okhttp3,而不是改造 –

1

Retrofit 2.0.0-beta3增加了一个converter-scalars模块,它提供了一个Converter.Factory,用于将字符串,8种基元类型和8种盒装基元类型转换为文本/普通物体。在普通的转换器之前安装它,以避免通过这些简单的标量,例如JSON转换器。