Retrofit 进阶篇 自定义转换器

1 想必各位android 开发人员 已经对retrofit+rxjava +okhttp 都有所了解 就算是大家没应用 也有所耳闻了 因为本人现在正在写一个新的工程 正在尝试着使用 这个很高大上的框架 这这里给大家介绍一下 所遇到的问题 已经新知识

基本创建 但是这对于我们一些应用 需要参数加密 数据解密的开发者来讲 这样基本的创建是不足够的 那么follow me

   retrofit = new Retrofit.Builder()
                    .client(HttpConnection.getInstance())
                    .addConverterFactory(GsonConverterFactory.create())//转换器
                    .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) //添加 RxJava 适配器
                    .baseUrl(Contacts.BASE_URL)
                    .build();

2 .自定义转换器

  • 继承Converter.Factory
public final class DecodeConverterFactory extends Converter.Factory {

    public static DecodeConverterFactory create() {
        return create(new Gson());
    }

    public static DecodeConverterFactory create(Gson gson) {
        return new DecodeConverterFactory(gson);
    }

    private final Gson gson;

    private DecodeConverterFactory(Gson gson) {
        if (gson == null) throw new NullPointerException("gson == null");
        this.gson = gson;
    }

    @Override
    public Converter<?, RequestBody> requestBodyConverter(Type type, Annotation[] parameterAnnotations, Annotation[] methodAnnotations, Retrofit retrofit) {
        TypeAdapter<?> adapter = gson.getAdapter(TypeToken.get(type));
        return new DecodeRequestBodyConverter<>(gson, adapter);
    }

    @Override
    public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) {
        TypeAdapter<?> adapter = gson.getAdapter(TypeToken.get(type));
        return new DecodeResponseBodyConverter<>(adapter);
    }
}
  • 分别实现request,response转换器
public class DecodeRequestBodyConverter<T> implements Converter<T, RequestBody> {
    private static final MediaType MEDIA_TYPE = MediaType.parse("application/json; charset=UTF-8");
    private static final Charset UTF_8 = Charset.forName("UTF-8");

    private final Gson gson;
    private final TypeAdapter<T> adapter;
    DecodeRequestBodyConverter(Gson gson,TypeAdapter<T> adapter){
        this.gson = gson;
        this.adapter = adapter;
    }
    @Override
    public RequestBody convert(T value) throws IOException {
        Buffer buffer = new Buffer();
        Writer writer = new OutputStreamWriter(buffer.outputStream(),UTF_8);
        JsonWriter jsonWriter = gson.newJsonWriter(writer);
        adapter.write(jsonWriter,value);
        jsonWriter.flush();
        byte[] bytes=buffer.readByteArray();
        try{
            bytes=GzipUtil.compress(bytes);
        }catch(Exception e){
            e.printStackTrace();
        }

        bytes=new TripleDES (Contacts.PARAMETER_ENCRYPTION_KEY).encryptionByteData(bytes);
        return RequestBody.create(MEDIA_TYPE,bytes);
    }
}
public class DecodeResponseBodyConverter<T> implements Converter<ResponseBody, T> {
    private final TypeAdapter<T> adapter;

    DecodeResponseBodyConverter(TypeAdapter<T> adapter) {
        this.adapter = adapter;
    }

    @Override
    public T convert(ResponseBody value) throws IOException {

        byte[] bytes = value.bytes();
        //先解密 在解压
        try {
            bytes=  GzipUtil.unZip(new TripleDES(Contacts.BODY_ENCRYPTION_KEY).decryptionByteData(bytes));
        } catch (Exception e) {
            e.printStackTrace();

        }
        LogUtils.d(new String(bytes,"UTF-8"));

        //解密字符串
        return bytes==null?null:adapter.fromJson(new String(bytes,"UTF-8"));
    }
}
  • retrofit的配置


    对就是自定义的转换器的名称.png
  • 接下来 说说我遇到的问题 我定义了自定义转换器之后 发现 只是走解密 加密却怎么都不走 自己一律了半天 才发现 自己的post 请求 标签 竟然写成了@ Query 我忍不了自己了 这么二 竟然 这里要很注意的 @Body 这个标签
@POST("check")
    Observable<DataVo<MessageVo,Object>> getTopMovie(@Body EquipmentParam equipment);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容