美文网首页
记录的一些Retrofit的小用法

记录的一些Retrofit的小用法

作者: 23行者 | 来源:发表于2017-10-30 00:51 被阅读0次

本文仅记录一些在使用Retrofit+OkHttp+RxJava模式时所用到的一些方案,方便查找,说明什么的还是算了吧

自定义转换器

提供的转换器虽方便,可要完全按Json建model还是算了吧

  • 最直接的转换器,回调一个JsonObject

    public class CommonConverterFactory extends Converter.Factory {
        private RequestJsonInterface dealInterface;

        @Nullable
        @Override
        public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) {
            return new JsonResponseBodyConverter<>();
        }

        @Nullable
        @Override
        public Converter<?, RequestBody> requestBodyConverter(Type type, Annotation[] parameterAnnotations, Annotation[] methodAnnotations, Retrofit retrofit) {
            return super.requestBodyConverter(type, parameterAnnotations, methodAnnotations, retrofit);
        }

        public CommonConverterFactory() {

        }

        public CommonConverterFactory(RequestJsonInterface dealInterface1) {
            dealInterface = dealInterface1;
        }

        public class JsonResponseBodyConverter<T> implements Converter<ResponseBody, T> {
            @Override
            public T convert(ResponseBody value) throws IOException {
                String response = value.string();
                try {
                    JSONObject jsonObject = new JSONObject(response);
                    if (dealInterface != null) {
                        return (T) dealInterface.deal(jsonObject);
                    }else {
                        return (T) new Object();
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }

                return null;
            }
        }

    }


这里建立了一个简单的转换器,其中的JsonResponseBodyConverter会将ResponseBody转换为一个JsonObject,然后可以按照自己的意思处理,自然,也可以对其进行扩展。

通过拦截器进行请求时的自动加密

加密是一个常见需求,以确保传递的正确性,多数时是通过要传递的参数通过一定的算法生成一个加密值,可以通过拦截器获取所有的参数并进行加密

//创建的一个请求工具类的初始化方法
public RequestHelper(int timeOut, final boolean isSignature, final boolean isUserID, Converter.Factory factory) {
        HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
        loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder()
                .connectTimeout(timeOut, TimeUnit.SECONDS)
                .writeTimeout(timeOut, TimeUnit.SECONDS)
                .readTimeout(timeOut, TimeUnit.SECONDS);
        if (!(!isKey & !isSignature)) {
            clientBuilder.addInterceptor(new Interceptor() {
                @Override public Response intercept(Chain chain) throws IOException {
                    Request request = chain.request();
                    Request.Builder requestBuilder = request.newBuilder();
                    if (request.body() instanceof FormBody) {
                        FormBody.Builder builder = new FormBody.Builder();
                        FormBody body = (FormBody)request.body();
                        Map<String, String> param = new HashMap<String, String>();
                        for (int index = 0; index < body.size(); index++) {
                            param.put(body.encodedName(index), body.encodedValue(index));
                            builder.addEncoded(body.encodedName(index), body.encodedValue(index));
                        }
                        
                        if (isKey) {
                        //此处是希望为每一个请求添加一个参数key
                            if (BaseApplication.getKey() != null) {
                                builder.add("key", BaseApplication.getKey());
                                param.put("key", BaseApplication.getKey());
                            }
                        }
                        if (isSignature) {
                        //此处为添加加签参数signature
                            builder.add("signature", encryptParam(param));
                        }
                        requestBuilder.method(request.method(), builder.build());
                    }
                    Request newRequest = requestBuilder.build();
                    return chain.proceed(newRequest);
                }
            });
        }
        clientBuilder.addInterceptor(loggingInterceptor);
        OkHttpClient client = clientBuilder.build();
        Retrofit retrofit = new Retrofit.Builder().baseUrl(BASE_URL).client(client).addConverterFactory(factory)
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create()).build();
        requestApi = retrofit.create(RequestApi.class);
    }

/**加签函数*/
private String encryptParam(Map<String, String> param) {
    String encrypt = "";
    ***加签过程***
    return encrypt;
}

相关文章

  • 记录的一些Retrofit的小用法

    本文仅记录一些在使用Retrofit+OkHttp+RxJava模式时所用到的一些方案,方便查找,说明什么的还是算...

  • Retrofit 源码解析

    Retrofit 源码解析 简单用法 Retrofit最简单的用法就是定义一个接口,创建Retrofit对象,调用...

  • Retrofit Https踩坑记录

    Retrofit Https踩坑记录 前言 新司机上路,坑多,本文重点是踩坑,不详细讲retrofit用法,本文不...

  • Retrofit 入门

    Retrofit用法详解 参考:Retrofit 官方APIRetrofit用法详解(入门看这篇就够了) 一、简介...

  • Retrofit2个人使用总结

    该文章讲述Retrofit中的一些基本使用总结,不涉及源码的介绍,是个人在使用中总结出来对Retrofit的用法。...

  • 一起实现一下网络请求吧(Retrofit2+rxjava)

    关于Retrofit+RxJava的基本用法,本文不作详细介绍,可以参考Retrofit官方文档Retrofit官...

  • RxJava + Retrofit 简单使用

    RxJava接入 RxJava 简单用法 Retrofit 简单使用 RxJava + Retrofit RxJa...

  • Retrofit

    Retrofit用法总结 一.什么是retrofit retrofit是现在比较流行的网络请求框架,可以理解为ok...

  • Retrofit2+Rxjava-Rxjava2.x-篇一-用起

    从Retrofit基本用法MonkeyLei:Retrofit+Rxjava-以自己的方式重头开始-入门篇 -> ...

  • Retrofit源码分析

    用法:retrofit是怎么创建service接口实例的? 调用retrofit 的create方法,通过动态代理...

网友评论

      本文标题:记录的一些Retrofit的小用法

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