ban54 2016-07-10 08:44 采纳率: 0%
浏览 10749
已结题

Android Retrofit POST请求加公共参数

最近刚开始接触Retrofit,碰到一个问题:
服务器要求所有POST方式接口都带上TOKEN等字段,如果每个接口都单独写明显不符合程序员的气质,那么问题来了:Retrofit里如何在请求的时候统一给请求加上这些公共的参数?
我猜想应该是在拦截器里,但试了一下,POST方式不知道怎么加,求大神指导。

  • 写回答

1条回答 默认 最新

  • naivor 2016-07-10 11:11
    关注

    自己定义一个interceptor,在里面处理,比如

     public class ParamsInterceptor implements Interceptor {
        private static final String TAG = "request params";
        private Context context;
    
        @Inject
        public ParamsInterceptor(Context context) {
            this.context = context;
        }
    
        @Override
        public Response intercept(Chain chain) throws IOException {
    
            Request orgRequest = chain.request();
    
    
            RequestBody body = orgRequest.body();
            //收集请求参数,方便调试
            StringBuilder paramsBuilder = new StringBuilder();
    
            if (body != null) {
    
                RequestBody newBody = null;
    
                if (body instanceof FormBody) {
                    newBody = addParamsToFormBody((FormBody) body, paramsBuilder);
                } else if (body instanceof MultipartBody) {
                    newBody = addParamsToMultipartBody((MultipartBody) body, paramsBuilder);
                }
    
    
                if (null != newBody) {
                    //打印参数
                    LogUtil.i(TAG, paramsBuilder.toString());
    
                    Request newRequest = orgRequest.newBuilder()
                            .url(orgRequest.url())
                            .method(orgRequest.method(), newBody)
                            .build();
    
                    return chain.proceed(newRequest);
                }
    
    
            }
    
            return chain.proceed(orgRequest);
    
        }
    
        /**
         * 为MultipartBody类型请求体添加参数
         *
         * @param body
         * @param paramsBuilder
         * @return
         */
        private MultipartBody addParamsToMultipartBody(MultipartBody body, StringBuilder paramsBuilder) {
            MultipartBody.Builder builder = new MultipartBody.Builder();
            builder.setType(MultipartBody.FORM);
    
            //添加appcode
            String appcode = context.getString(R
                    .string.appkey);
            builder.addFormDataPart("appcode", appcode);
    
    
            paramsBuilder.append("appcode=" + appcode);
    
            //添加id,city参数
            User user = BaseRepository.getUser();
            if (user != null) {
                String id = user.id() + "";
                UserType userType = user.userType();
    
                if (userType == UserType.BEAUTICIAN) {
                    builder.addFormDataPart("beautician_id", id);
    
                    paramsBuilder.append("&");
                    paramsBuilder.append("beautician_id=" + id);
                } else  if (userType == UserType.BEAUTYSHOP){
                    builder.addFormDataPart("bp_id", id);
    
                    paramsBuilder.append("&");
                    paramsBuilder.append("bp_id=" + id);
                }
    
                //城市
                String city = user.city();
    
                builder.addFormDataPart("city", city);
    
                paramsBuilder.append("&");
                paramsBuilder.append("city=" + city);
            }
    
            //添加原请求体
            for (int i = 0; i < body.size(); i++) {
                builder.addPart(body.part(i));
            }
    
            return builder.build();
        }
    
        /**
         * 为FormBody类型请求体添加参数
         *
         * @param body
         * @param paramsBuilder
         * @return
         */
        private FormBody addParamsToFormBody(FormBody body, StringBuilder paramsBuilder) {
            FormBody.Builder builder = new FormBody.Builder();
    
            //添加appcode
            String appcode = context.getString(R
                    .string.appkey);
            builder.add("appcode", appcode);
    
            paramsBuilder.append("appcode=" + appcode);
    
            //添加id,city参数
            User user = BaseRepository.getUser();
            if (user != null) {
                String id = user.id() + "";
                UserType userType = user.userType();
    
                if (userType == UserType.BEAUTICIAN) {
                    builder.add("beautician_id", id);
    
                    paramsBuilder.append("&");
                    paramsBuilder.append("beautician_id=" + id);
                } else  if (userType == UserType.BEAUTYSHOP){
                    builder.add("bp_id", id);
    
                    paramsBuilder.append("&");
                    paramsBuilder.append("bp_id=" + id);
                }
    
                //城市
                String city = user.city();
    
                builder.add("city", city);
    
                paramsBuilder.append("&");
                paramsBuilder.append("city=" + city);
            }
    
            //添加原请求体
            for (int i = 0; i < body.size(); i++) {
                builder.addEncoded(body.encodedName(i), body.encodedValue(i));
                paramsBuilder.append("&");
                paramsBuilder.append(body.name(i));
                paramsBuilder.append("=");
                paramsBuilder.append(body.value(i));
            }
    
            return builder.build();
        }
    }
    
    评论

报告相同问题?

悬赏问题

  • ¥15 树莓派与pix飞控通信
  • ¥15 自动转发微信群信息到另外一个微信群
  • ¥15 outlook无法配置成功
  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题