Android Retrofit2.1.0设置编码格式GBK

设置接口如下:

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

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。

posted @ 2018-02-02 13:30  zhaogaojian  阅读(1779)  评论(0编辑  收藏  举报