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);
1 2 3 4 5 6 7 8 9 | //针对不同的情况写 Log <br>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对象
1 2 3 4 5 | Retrofit retrofit = new Retrofit.Builder() .baseUrl( "http://xxxxxxxxxxxxxxxxxxxx" ) .client(httpClient.build()) .addConverterFactory(GsonConverterFactory.create(date, httpHeadInfo)) .build(); |
1 | GsonConverterFactory是附加器(按照设计模式,好像是AOP,面向切面编程)<br><br><br>3、body加密的时候,写在GsonConverterFactory的 requestBodyConverter 里<br><br>注意,相对于ASP.Net mvc来说,接口里边传入 @Body 的话呢,在服务器端是接收不到的。你需要把这些东西通过 FormBody重新赋值一下<br><br> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | @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, "" ); } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器