【Android实战】----Android Retrofit2.1.0设置编码格式GBK
16lz
2021-01-23
设置接口如下:
public interface IHttpService { /** * 获取userId * @param params * @return */ @FormUrlEncoded @POST("user/userid.do") Call getUserById(@FieldMap(encoded = true) Mapparams); /** * 获取userId * @param params * @return */ @FormUrlEncoded @POST("user/login.do") Call login(@FieldMap(encoded = true) Mapparams);}
retrofit中@FormUrlEncoded的默认编码方式为UTF-8,这个没法改变(目前本人所知,如有误请赐教),那么可以通过MediaType进行设置
/** * 添加统一header,超时时间,http日志打印 * @return */ public static OkHttpClient genericClient() { HttpLoggingInterceptor logging = new HttpLoggingInterceptor(); logging.setLevel(HttpLoggingInterceptor.Level.BODY); OkHttpClient httpClient = new OkHttpClient.Builder() .addInterceptor(new Interceptor() { @Override public okhttp3.Response intercept(Chain chain) throws IOException { Request request = chain.request(); Request.Builder requestBuilder = request.newBuilder(); request = requestBuilder.post(RequestBody.create(MediaType.parse("application/x-www-form-urlencoded;charset=GBK"), URLDecoder.decode(bodyToString(request.body()), "UTF-8"))) .build(); return chain.proceed(request); } }) .addInterceptor(logging) .connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS) .writeTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS) .readTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS) .build(); return httpClient; }
如上设置了 "application/x-www-form-urlencoded;charset=GBK"
但是request.body()获取到的是已经是经过@FormUrlEncoded编码(UTF-8)过的,因此要先用UTF-8解码,再用GBK编码
bodyToString()的实现
private static String bodyToString(final RequestBody request) { try { final RequestBody copy = request; final Buffer buffer = new Buffer(); if (copy != null) copy.writeTo(buffer); else return ""; return buffer.readUtf8(); } catch (final IOException e) { return "did not work"; } }
更多相关文章
- android ViewPager之OnPageChangeListener接口
- [置顶] Android 使用Hprose 调用Https接口
- JNI之------C调用java接口
- 【Android】Web开发之通过Apache接口处理Http请求
- 【Android】简单的接口回调
- 【APP】微信接口对Android与IOS验证方式的差异