Android Retrofit2.1.0设置编码格式GBK

时间:2023-11-19 09:47:44

设置接口如下:

  1. public interface IHttpService {
  2. /**
  3. * 获取userId
  4. * @param params
  5. * @return
  6. */
  7. @FormUrlEncoded
  8. @POST("user/userid.do")
  9. Call<UserIdBean> getUserById(@FieldMap(encoded = true) Map<String, String>params);
  10. /**
  11. * 获取userId
  12. * @param params
  13. * @return
  14. */
  15. @FormUrlEncoded
  16. @POST("user/login.do")
  17. Call<UserBean> login(@FieldMap(encoded = true) Map<String, String>params);
  18. }

retrofit中@FormUrlEncoded的默认编码方式为UTF-8,这个没法改变(目前本人所知,如有误请赐教,那么可以通过MediaType进行设置

/**

  1. * 添加统一header,超时时间,http日志打印
  2. * @return
  3. */
  4. public static OkHttpClient genericClient() {
  5. HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
  6. logging.setLevel(HttpLoggingInterceptor.Level.BODY);
  7. OkHttpClient httpClient = new OkHttpClient.Builder()
  8. .addInterceptor(new Interceptor() {
  9. @Override
  10. public okhttp3.Response intercept(Chain chain) throws IOException {
  11. Request request = chain.request();
  12. Request.Builder requestBuilder = request.newBuilder();
  13. request = requestBuilder.post(RequestBody.create(MediaType.parse("application/x-www-form-urlencoded;charset=GBK"),
  14. URLDecoder.decode(bodyToString(request.body()), "UTF-8")))
  15. .build();
  16. return chain.proceed(request);
  17. }
  18. })
  19. .addInterceptor(logging)
  20. .connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS)
  21. .writeTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS)
  22. .readTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS)
  23. .build();
  24. return httpClient;
  25. }

如上设置了

"application/x-www-form-urlencoded;charset=GBK"

但是request.body()获取到的是已经是经过@FormUrlEncoded编码(UTF-8)过的,因此要先用UTF-8解码,再用GBK编码

bodyToString()的实现

  1. private static String bodyToString(final RequestBody request) {
  2. try {
  3. final RequestBody copy = request;
  4. final Buffer buffer = new Buffer();
  5. if (copy != null)
  6. copy.writeTo(buffer);
  7. else
  8. return "";
  9. return buffer.readUtf8();
  10. } catch (final IOException e) {
  11. return "did not work";
  12. }
  13. }

出处http://blog.csdn.net/honghailiang888。