设置接口如下:

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";
        }
    }


更多相关文章

  1. Android开发一些实用的类、方法及接口(新手向)
  2. 通过数据库接口获取到的中文数据是问号怎么办?
  3. 在网页程序或Java程序中调用接口实现短信猫收发短信的解决方案
  4. Java 8 新特性-菜鸟教程 (3) -Java 8 函数式接口
  5. Java开发水吧点饮品系统(顶层父类对象做接口参数)
  6. 怎么用java 实现两个web service之间调用各自的接口 实现数据的
  7. 接口之命令模式
  8. 关于Java中接口继承接口
  9. php 调用java 接口

随机推荐

  1. unity_android工程和android_studio工程
  2. 避免在Java接口中使用数组的3个理由
  3. 【Java笔记】——抽象类和接口
  4. Android监控WIFI和GSM状态并绘制网络强度
  5. android Activity的四种启动模式分析
  6. Alibaba Java开发手册索引规约学习笔记
  7. googlesamples/android-topeka学习笔记(
  8. Android Audio System 架构初探:库层(一)
  9. 利用opengl es画立方体的简单流程
  10. Android自定义万能Canvas画布