zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    clone()与clone(true)的区别
    内部插入节点的方法
    jquery动态创建页面元素
    removeClass() 方法
    addClass() 和 toggleClass()
    CSS()方法设置元素样式
    val()方法
    html() 和 text() 方法的区别
    C#导出Excel那些事
    Winform控件重写
  • 原文地址:https://www.cnblogs.com/zhaogaojian/p/8404736.html
Copyright © 2011-2022 走看看