• Android retrofit2 添加Header body加密,返回参数分析


    1、添加Header

    OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
    
    //添加Log httpClient.addNetworkInterceptor(getInterceptor(true));

    //添加固定的header参数
    httpClient.readTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS);
    httpClient.connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS);
    httpClient.writeTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS);
    //针对不同的情况写 Log  
    private HttpLoggingInterceptor getInterceptor(boolean debug) { HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); if (debug) { interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); // 测试 } else { interceptor.setLevel(HttpLoggingInterceptor.Level.NONE); // 打包 } return interceptor; }

      

    //添加动态的Header
    httpClient.addInterceptor(new HttpHeadInterceptor());
    private class HttpHeadInterceptor implements Interceptor {
    public HttpHeadInterceptor() {
           
        }
    
        @Override
        public okhttp3.Response intercept(Chain chain) throws IOException {
            Request originalRequest = chain.request();
            Request.Builder requestBuilder = originalRequest.newBuilder();
    
    
            requestBuilder.addHeader("time", "时间");
    //添加User-Agent
    String user = HttpHead.getUserAgent(); requestBuilder.addHeader("User-Agent", user); Request request = requestBuilder.build(); okhttp3.Response response = chain.proceed(request);

    //获取response的header String responseHeadTime
    = response.header("time").toString();return response; } }

    2、生成Retrofit对象

    Retrofit retrofit = new Retrofit.Builder()
                                    .baseUrl("http://xxxxxxxxxxxxxxxxxxxx")
                                    .client(httpClient.build())
                                    .addConverterFactory(GsonConverterFactory.create(date, httpHeadInfo))
                                    .build();
    

      

    GsonConverterFactory是附加器(按照设计模式,好像是AOP,面向切面编程)


    3、body加密的时候,写在GsonConverterFactory的 requestBodyConverter 里

    注意,相对于ASP.Net mvc来说,接口里边传入@Body的话呢,在服务器端是接收不到的。你需要把这些东西通过 FormBody重新赋值一下

        @Override
        public RequestBody convert(T value) throws IOException {
    
            if (value instanceof BaseSign) {
                String jsonstr = gson.toJson(value);
    
                String key = "android";
                Logger.debug("xxx", "AES加密前:" + jsonstr + "     key=" + key);
                key = Md5Util.parseStrToMd5L32(key);
                String newRequest = AESUtils.initEncode(jsonstr, key);
    
                return new FormBody.Builder().add("data", newRequest).build();
    
            } else {
                //这里是不加密的
                return RequestBody.create(MEDIA_TYPE, "");
            }
    

      

  • 相关阅读:
    一个完善的ActiveX Web控件教程
    用ATL开发和部署ActiveX网页控件
    非IE内核浏览器支持activex插件
    OCX控件在IE中无法侦测到键盘消息( MFC ActiveX Control in IE Doesn't Detect Keystrokes)
    CImageList使用简要说明
    VC,一条会被鼠标移动的直线
    Java NIO学习笔记之基本概念
    netty源码分析
    如何绕过验证码方式总结
    解决Eclipse 启动后总是Building WorkSpace(sleeping)
  • 原文地址:https://www.cnblogs.com/sdwdjzhy/p/6992745.html
Copyright © 2020-2023  润新知