美文网首页
android Retrofit2 返回json客户端与服务端加

android Retrofit2 返回json客户端与服务端加

作者: 张漂亮1号 | 来源:发表于2020-10-05 11:26 被阅读0次

    对response进行解密,retrofit设置自定义的ConverterFactory,因客户端与服务端使用json通信,因此我们参考官方提供GsonConverterFactory编写

    Retrofit retrofit = new Retrofit.Builder()
                    .client(getOkHttpClient())
                    .addConverterFactory(CustomGsonConverterFactory.create())
                    .baseUrl(BASE_URL)
                    .build();
    
    
    class CustomGsonResponseConverter<T> implements Converter<ResponseBody, T> {
    
        private final Gson gson;
        private final TypeAdapter<T> adapter;
    
        CustomGsonResponseConverter(Gson gson, TypeAdapter<T> adapter) {
            this.gson = gson;
            this.adapter = adapter;
        }
    
        @Override
        public T convert(ResponseBody value) throws IOException {
            try {
                String originalBody = value.string();
                // 解密
                String body = EncryptUtils.decryptParams(originalBody);
                // 获取json中的code,对json进行预处理
                JSONObject json = new JSONObject(body);
                int code = json.optInt("code");
                // 当code不为0时,设置data为{},这样转化就不会出错了
                if (code != 0) {
                    json.put("data", new JSONObject());
                    body = json.toString();
                }
    
                return adapter.fromJson(body);
            } catch (Exception e) {
                throw new RuntimeException(e.getMessage());
            } finally {
                value.close();
            }
        }
    
    
    class GsonRequestBodyConverter<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;
    
      GsonRequestBodyConverter(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.close();
        return RequestBody.create(MEDIA_TYPE, buffer.readByteString());
      }
    }
    
    
    image
    借鉴原文https://blog.csdn.net/weixin_43901866/article/details/86578148

    相关文章

      网友评论

          本文标题:android Retrofit2 返回json客户端与服务端加

          本文链接:https://www.haomeiwen.com/subject/cdcauktx.html