Retrofit2源码解析(二)添加 JacksonConverterFactory转化器

1、获取实例时,我们添加个转化器

        retrofit = new Retrofit.Builder().baseUrl("http://localhost:8080/campus/")
                .addConverterFactory(JacksonConverterFactory.create())
                .build();

这时候相当于就多了一个转化器。所以还是支持上篇中的请求方式(主要是返回类型和入参类型)

2、话不多话。直接看转化器源码,看它支持哪些类型

retrofit2.converter.jackson.JacksonConverterFactory.java

public final class JacksonConverterFactory extends Converter.Factory {

  public static JacksonConverterFactory create() {
    return create(new ObjectMapper());
  }

  public static JacksonConverterFactory create(ObjectMapper mapper) {
    return new JacksonConverterFactory(mapper);
  }

  private final ObjectMapper mapper;

  private JacksonConverterFactory(ObjectMapper mapper) {
    if (mapper == null) throw new NullPointerException("mapper == null");
    this.mapper = mapper;
  }
//返回类型retrofit2.Call<T> T没有任何限制,什么都可以由jackson处理
  @Override
  public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations,
      Retrofit retrofit) {
    JavaType javaType = mapper.getTypeFactory().constructType(type);
    ObjectReader reader = mapper.reader(javaType);
    return new JacksonResponseBodyConverter<>(reader);
  }

//接口的形参类型也没有任何限制,什么都可以由jackson处理
  @Override
  public Converter<?, RequestBody> requestBodyConverter(Type type,
      Annotation[] parameterAnnotations, Annotation[] methodAnnotations, Retrofit retrofit) {
    JavaType javaType = mapper.getTypeFactory().constructType(type);
    ObjectWriter writer = mapper.writerWithType(javaType);
    return new JacksonRequestBodyConverter<>(writer);
  }
}

是不是很爽。我们试下,在第一篇的基础对请求接口做修改

    public interface HttpLogin {
        @POST("account/login")
        //直接返回一个HashMap看看
        retrofit2.Call<HashMap<String, Object>> login(@Body Account body);
    }
   @Test
    public void testRetrofit() {
        retrofit2.Call<HashMap<String, Object>> login = retrofit.create(HttpLogin.class)
                .login(new Account("yincs", null));
        login.enqueue(new retrofit2.Callback<HashMap<String, Object>>() {

            public void onResponse(retrofit2.Call<HashMap<String, Object>> call,
                                   retrofit2.Response<HashMap<String, Object>> response) {
                System.out.println("onResponse " + response.body().get("des"));
            }

            public void onFailure(retrofit2.Call<HashMap<String, Object>> call, Throwable t) {

                System.out.println("onFailure " + t.getMessage());
            }
        });


        sleep(12000);
    }

执行结果
onResponse 参数错误[密码不能为空]
Process finished with exit code 0

也是成功的 

一般服务器返回的参数形式一样。那我们能不能用一个统一类加泛型处理呢?
答案是当然可以的
先创建一个统一类

public class AppRes<T> {
    private int code;
    private String des;
    T data;

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getDes() {
        return des;
    }

    public void setDes(String des) {
        this.des = des;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
}

接口改下

     public interface HttpLogin {
        @POST("account/login")
        retrofit2.Call<AppRes<User>> login(@Body Account body);
    }

执行下

        retrofit.create(HttpLogin.class)
                .login(new Account("ycs",null))
                .enqueue(new retrofit2.Callback<AppRes<User>>() {
                    @Override
                    public void onResponse(retrofit2.Call<AppRes<User>> call, retrofit2.Response<AppRes<User>> response) {
                        System.out.println("onResponse " + response.body().getDes());
                    }

                    @Override
                    public void onFailure(retrofit2.Call<AppRes<User>> call, Throwable t) {
                        System.out.println("onFailure " + t.getMessage());
                    }
                });
返回结果
onResponse 参数错误[密码不能为空]

Process finished with exit code 0

一切ok!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
retrofit2是一个用于Android和Java平台的类型安全的HTTP客户端库,它可以用来进行网络请求和数据交互。在retrofit2中,可以使用SSE(Server-Sent Events)来进行服务推送的实现。 SSE是一种在客户端和服务之间单向实时通信的技术,它允许服务发送事件数据到客户端,而客户端则可以监听这些事件并做出相应的处理。在retrofit2中,可以通过定义一个接口来实现SSE的处理,如下所示: ```java public interface SSEService { @GET("/events") Call<ResponseBody> getEvents(); } ``` 在这个例子中,我们定义了一个SSEService接口,其中包含一个用于获取事件数据的GET请求。当调用这个接口时,retrofit2会使用OkHttp来建立连接并监听服务发送的事件数据。 另外,为了处理服务发送的事件数据,可以使用retrofit2的Call对象和Callback来实现。例如: ```java SSEService service = retrofit.create(SSEService.class); Call<ResponseBody> call = service.getEvents(); call.enqueue(new Callback<ResponseBody>() { @Override public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) { // 处理服务发送的事件数据 } @Override public void onFailure(Call<ResponseBody> call, Throwable t) { // 处理请求失败的情况 } }); ``` 通过使用retrofit2的SSE功能,可以很方便地实现客户端和服务之间的实时事件推送和处理。这使得在Android和Java应用中,可以更加灵活和高效地处理服务推送的事件数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值