Android Retrofit POST请求加公共参数 1C

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

1个回答

自己定义一个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();
    }
}
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
post请求添加公共参数
Request original = chain.request();         FormBody formBody = (FormBody) original.body();         String name = formBody.name(0);         String value = formBody.value(0);         FormBo
策略模式实现 retrofit 的get和post请求的公共参数(一)
策略模式的作用,作用是替换if,elst if ,switch case,可是为什么我就替换不了呢? 比如: 图书价格,初级会员9折,高级会员打8折 通常实现: private double getPrice(int grade, double price) { switch (grade) { case 1: ...
Retrofit网络请求封装公共参数GET和POST请求
public interface ApiService {    /**     * 无参get请求     * http://service.meiyinkeqiu.com/service/ads/cptj     *     * @return     */    //通过注解声明请求方式    @GET(&quot;service/ads/cptj&quot;)    Call&amp;lt;UserInfo&amp;gt; ...
关于retrofit的Post请求
首先网上的讲解一大堆,这里只是自己当时的问题,或者是接口的问题,现在吧写出来,为了下次使用 为嘛的接口是 http:xxxxx /xxx/xxx 然后需要是post请求 方式是 {“dev”:”xxxxxooooo”} 自己找了一大堆,最后解决ok,下面代码 BASE_URL = "https://xxxxxx.xxx/xxxx/";//http服务接口 public interface Api
android retrofit 获取post请求参数值
Android 使用retrofit + okhttp + Rxjava2.x 做网络请求已成为趋势 我最近使用 Flowable> getFacevalidety(@Part("ID") String ID, @Part("name") String name, @Part MultipartBody.Part part) 做网络请求的时候发现一个很有意思的问题, 如:int ID =
retrofit的post方式请求数组
一个数组里有两个实体类
Retrofit基础之:GET与POST请求
Retrofit是大名鼎鼎的Square公司搞出来的一个网络请求框架。其本身是对okhttp做了一层封装,网络请求都交给给了Okhttp。 Retrofit只需要通过简单的配置就能进行网络请求。开源地址:http://square.github.io/retrofit/ 开始学点最简单地GET及POST请求,直接上代码,文字表达见注释: 第一步:首先定义接口类: /** * descript
安卓Retrofit post请求 带参数
写个这玩意可费事 ,我是安卓开发的小白我叫菜鸟,欢迎大家能点开我的博客。在这里我们共同成长,最近没事写了这玩意,网上一大堆,我也看不懂。自己试着写了个,来起来就直接复制粘贴的型的代码,希望给像我这样懒得人带来一股清流,废话不多说,开始搞起来: 1.先加个依赖: compile 'com.squareup.retrofit2:retrofit:2.1.0' compile
Retrofit离线缓存,支持Post请求
有网络的时候使用网络获取数据,网络不可用的情况下使用本地缓存。 Retrofit本身并没有可以设置缓存的api,它的底层网络请求使用Okhttp,所以添加缓存也得从Okhttp入手。 Okhttp是只支持Get请求的,如果我们使用其他方式请求比如Post,请求的能够回调onResponse方法,但是通过 response.body()来获取请求的数据会得到null, response.code(...
post请求加json参数方式二
utputStreamWriter; import java.io.PrintWriter; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.net.URLEncoder; import java.security.SecureRandom; import java.
Retrofit网络请求GET请求POST请求
Retrofit网络请求,内含GET、POST请求,POST请求需要用自己的服务器针对性接口测试、GET请求公开接口测试,解析内容简单按需自己项目,很好的框架通俗易懂
okHttp请求公共参数
othttp添加请求公共参数的几种方法 第一种 添加在请求链接尾部 HttpUrl url = original.url().newBuilder() //请求尾部链接 .addQueryParameter(VERSION, &quot;&quot;) .addQueryParameter(APP_VERSION, &quot;&quot;) ...
Retrofit封装公共请求Token,和拼接参数,贼简单
//这个是啥我就不说了 private MyRetrofitManager(String utl_bean) { retrofit = new Retrofit.Builder() .baseUrl(utl_bean) .addConverterFactory(GsonConverterFactory.create()) ...
【问题】解决Retrofit中为Post请求设置统一参数
问题:Retrofit中为Post请求设置统一参数 情景:使用RequestBody发送Post请求,无法添加统一参数,换成FormBody网上倒是有很多解决方案,但是FormBody一方面MediaType跟后台要求的对应不上(不确定这个对请求有没有影响),另一方面只能传String参数(如果有什么方法可以传递其他参数欢迎留言补充),跟后台的要求对不上。 解决方案: 1.自定义Reques...
无参数的post请求
使用过时无参post请求,现在gradle里添加依赖
策略模式(注解版)实现 retrofit 的get和post请求的公共参数(二)
上篇博客 http://blog.csdn.net/zx_android/article/details/79273797,通过换汤不换药的方式把客户的switch case转移到了context中,我始终不是太满意,后来终于找到一个大神的一篇文章:设计模式学习之策略模式 得到了一个比较满意的解决。 (想用纯策略模式来完全解决 if else if switch case这种需求,是做不到的,...
post请求加json参数或xml参数
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.MalformedURLException; import java.net.UR...
Android post请求网络数据(json作为参数)
参数说明: //   path 请求路径 //   json  封装好的json数据,关于封装json数据的方法,最下面有。 public static String JsonPost(final String path, final JSONObject json) {  BufferedReader in = null; String result = ""; Output
Android post请求时参数上传失败
Android JSON解析之参数上传失败 1.问题描述:今天实现一个很普通的发送验证码的功能,设置监听,执行联网发送验证码的请求,JSON解析返回的字      符串,没毛病哈。那么,问题来了,后台显示发送验证码成功,前端接受到的却是手机号为空,mmp不      可
Retrofit 拦截器-基础公共参数拦截器实现
为了紧跟潮流,之前在公司新开项目中设计使用了MVP+Retrofit+Dagger2模式的开发框架,但由于当时时间紧,任务中。尝试去通过拦截器添加基础参数,但是POST请求一直不成功,最终无奈放弃,使用了最Low的方式,GET,POST请求全部是用@QueryMap注解来添加请求参数,然后将基础参数封装一个公共的方法,每次请求接口是调用。这也成为了我心中一直的一个梗,久久不能释怀。后来曾多次尝试解...
android 异步 post请求 与 同步post请求
本文是将 通过AES加密后的数据   上传至后台      请求下来的数据经过 AES解密     :  AES解密内容   详见  http://blog.csdn.net/zl406707/article/details/77369310 使用过AsyncTask 的同学都知道一个异步加载数据最少要重写以下这两个方法: doInBackground(Params…) 后台执行
Retrofit学习(三)-普通post请求
Post表单提交-单个参数 @Field 接口 /** 表单提交要加 @FormUrlEncoded * 登录 * @param username 用户名 * @param password 密码 * @param deviceId 设置ID * @param platform 平台这里是Android * @param verI...
Retrofit基础(get/post请求,上传图片,注册)
权限:   导入依赖:     compile 'com.squareup.retrofit2:retrofit:2.0.1'     compile 'com.squareup.okio:okio:1.5.0'     compile 'com.squareup.okhttp3:okhttp:3.2.0'     compile 'com.squareup.retrofi
Retrofit源码解析之POST、GET请求
需要注意的是:下面说的GET请求和POST请求里面的@的方法,不是说只属于它们自己,灵活点。比如@path既适用于@GET也适用于@POST GET请求(获取资源) 用来请求访问已被URI识别的资源,指定的资源经服务端解析后返回响应内容。对于Retrofit2.0中的Get请求: @Url 作用:直接传入一个请求的 URL变量 用于URL设置 具体使用: public in...
Retrofit get、post请求用法整理
Retrofit使用步骤: 1.定义一个接口。用来封装URL地址和数据请求 2.实例化retrofit 3.调用retrofit实例创建接口和服务对象 4.接口服务对象调用接口中的方法获取call对象 5.call对象执行请求(异步,同步请求)
用retrofit发送POST请求到服务器
@POST("loginRAction!register.action")rn Observable regist(@Body Useruser);rn我这样给请求服务器是成功的,但是服务器那边接收的user是null,服务器是status框架,代码如下:rnpublic class LoginRAction rn private User userinfo;rn private JSONObject obj;rn public User getUserinfo() rn return userinfo;rn rnrn public void setUserinfo(User userinfo) rn this.userinfo = userinfo;rn rnpublic String register() throws IOExceptionrn LoginRService service=(LoginRService) WebUtil.getBean("LoginRService");rn int count = 0;rn try rn count = service.register(userinfo);rn catch (Exception e) rn e.printStackTrace();rn rn if (count > 0) //count=1 注册成功rn WebUtil.print(Constant.zhuce_SUCCESS);rn else rn WebUtil.print(Constant.zhuce_FAIL);rn rn return null;rn rnrn我怀疑是自己的post请求写的有问题,然后搜到了好像我的实体类必须自己实现converter,如下:rnpublic class User implements Converter rnrn @SerializedName("userid")rn public String userid;rn 。rn 。rn 。rnrn@Overridern public Object convert(Object value) throws IOException rn return value;rn rnrnrn结果服务器那边还是接收到的是null
retrofit笔记一:发送get和post请求
Retrofit的原理网上比较多,这边博客的定位就是如何去使用retrofit完成需求。 Retrofit是一个网络操作接口框架,底部真正进行网络请求实现的是OkHttp。 Retrofit使用步骤: 1&amp;amp;amp;amp;amp;amp;amp;gt;定义一个接口 public interface HttpService { /** * 定义请求方法 */ @GET(&amp;amp;amp;amp;amp;amp;quot;/&amp;amp;a
Retrofit post 添加请求头请求体样例
Retrofit retrofit1 = new Retrofit.Builder() .baseUrl(&quot;http://39.107.224.233/&quot;) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .addConverterFactory(GsonConverterFact...
Retrofit的post get请求使用(流程完整)
Retrofit的post get请求使用(流程完整)
Retrofit 标准版post请求 提交jason字符串
@OnClick(R.id.click) public void onViewClicked() { login(); } private void login() { // String baseUrl = "http://192.168.8.253:8080/jewel-api"; // String apiUrl
Retrofit使用form-data方式的Post请求
将Post请求的数据放在form-data中,使用Retrofit框架的实现方式 前言:我们一般使用Retrofit进行Post的请求的时候都是把上传的数据放在请求体中的,但是在上传文件等操作时会使用到form-data方式上传数据。form-data表单数据 1.创建网络请求接口的两种方式 //适用于数据量少的情况 @Multipart @POST("app/user/lo
利用Retrofit执行Post、Get请求,通俗易懂
利用Retrofit执行Post、Get请求,通俗易懂
retrofit post请求多文件,partMap用法
1. APIService 定义注解 @Multipart @POST("cyxx/Feedback/add.do") Observable<ResponseBody> getFeedbackResult( @PartMap Map<String, RequestBody> params );2.代码里使用Map<String, RequestBod
Retrofit统一添加post请求的默认参数
前言 最近在学习使用Retrofit,并尝试将之引入到现有的项目中来。大家都知道,在Http请求中我们使用Content-Type来指定不同格式的请求信息: APP_FORM_URLENCODED(&quot;application/x-www-form-urlencoded&quot;), APP_JSON(&quot;application/json&quot;), APP_OCTET_STREAM(&quot;app...
post请求公共接口,参数为json串
写这个无非是因为近期用到post请求接口的时候,请求接口调用不通,老师报错:请求超时 最后才发现是因为 :请求的时间设定太短暂,而且网络因素也是其一,返回的数值太多,也会影响 这里贴一下源码: //url为 请求路径(请求的全路径例如:"http://101.201.74.202:8018/cas-web/login?service=http%3A%2F%2F127.0.0.
Android —— Retrofit 请求注解分析
Android 请求方式无非就是 POST、PUT、DELETE以及HEAD 这几种, Retrofit 中的注解: 1. GET ———-查找资源(查) 2. POST ——–修改资源(改) 3. PUT ———-上传文件(增) 4. DELETE —-删除文件(删) 5. HEAD——–只请求页面的首部 @QueryMap、@Path、@Body、@FormUrlEnc
初学者---Android (简单总结)Retrofit请求方式之get,post
自己用过的,没有坑 //get请求,无参数 @GET("product/getCatagory") Observable getCatagory(); /** * 根据newsid获取对应的资讯数据 * @param newsId * @return call */ //有参数 @GET("News/{newsId
perl post 请求加请求头
##给文件加星标 use LWP::UserAgent; use LWP; use Encode; use LWP::Simple; use LWP::UserAgent; use HTTP::Cookies; use HTTP::Headers; use HTTP::Response; use Encode; use URI::Escape; use URI::URL; use JSON;
android的post请求
一个简单的android小程序,基于post请求获取json内容并加以解析,代码极小,但是关键问题已经解决,有需要的话可以自己加以改编
android post请求的问题
问题描述是:客户端可以访问到服务器,但是服务器接受到的参数却为空。rn发送请求源码:rn[align=left]URL postURL=new URL(url);rn conn = (HttpURLConnection)postURL.openConnection();rn conn.setRequestMethod("POST");rn conn.setRequestProperty("Content-Language","en-CA");rn conn.setRequestProperty("Accept","text/javascript, text/ecmascript, application/x-javascript, */*, text/x-vcard, text/x-vcalendar, image/gif, image/vnd.wap.wbmp,textnd.wap.wml,applicationnd.wap.xhtml+xml,textml,text/css,text/vnd.wap.wml,application/vnd.wap.xhtml+xml,text/html,text/css");rn conn.setRequestProperty("Connection", "Keep-Alive");rn conn.setRequestProperty("Cache-Control", "no-cache");rn conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");rn conn.setRequestProperty("Charset", "UTF-8");rn conn.setDoOutput(true);rn conn.setDoInput(true);rn dos=new DataOutputStream(conn.getOutputStream());rnrn dos.write(property.getBytes("UTF-8"));rn dos.flush();[/align]rnrn服务器端源码:rn[align=left]rn try rn stream = request.getInputStream();rn BufferedReader br = new BufferedReader(new InputStreamReader(stream, "UTF-8"));rn while ((string = br.readLine()) != null) rn sb.append(string);rn rn catch (IOException e2) rn e2.printStackTrace();rn rn String sstr = sb.toString();rn System.out.println(sstr);[/align]rnrn服务器上打印 sstr为空,不知道是什么原因。。。请求帮助rnrnrnrn
相关热词 c# login 居中 c# 考试软件 c# 自然语言分析 c# 分段读取文件 c# 泛型反射 c#打断点 c# 时间转多少秒 c# 线程函数加参数 c# modbus 读取 c#查询集合表