Android实战----Android Retrofit2.1.0设置编码格式GBK

Posted Herman-Hong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android实战----Android Retrofit2.1.0设置编码格式GBK相关的知识,希望对你有一定的参考价值。

设置接口如下:

public interface IHttpService 

    /**
     * 获取userId
     * @param params
     * @return
     */
    @FormUrlEncoded
    @POST("user/userid.do")
    Call<UserIdBean> getUserById(@FieldMap(encoded = true) Map<String, String>params);

    /**
     * 获取userId
     * @param params
     * @return
     */
    @FormUrlEncoded
    @POST("user/login.do")
    Call<UserBean> login(@FieldMap(encoded = true) Map<String, String>params);


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实战----Android Retrofit2.1.0设置编码格式GBK的主要内容,如果未能解决你的问题,请参考以下文章

android实战网址

Android项目实战Android开发进阶学习

okhttp文件上传失败,居然是Android Studio背锅?

Android实战技巧:ViewStub的应用

Android实战Android中处理崩溃异常

Android开发实战(二十一):浅谈android:clipChildren属性