OkHttp + Retrofit +Rxjava + JSON请求

本文介绍在Android项目中如何使用OkHttp、Retrofit和RxJava结合JSON请求体进行网络请求优化,通过自定义拦截器实现请求体JSON化并在请求中加入固定参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:

在Android项目开发中,网络请求如今常使用OkHttp + Retrofit + RxJava + JSON请求体 的请求架构。
后端使用SpringMVC的架构,这个架构需要接收JSON格式的请求体(如今大多数都是JSON),移动端则需要对RequestBody进行JSON化的处理。

解决方案:

将RequestBody请求体转化为JSON请求体,在请求体内加入固定参数。

主要思想是在创建OkHttp的时候设置拦截器,利用拦截器拦截请求体,获取请求体内容并改写重新整合到网络请求中。具体代码如下:

	Interceptor addQueryParameterInterceptor = new Interceptor() {
            @Override
            public Response intercept(Chain chain) throws IOException {
                Request originalRequest = chain.request();
                Request request;
                HttpUrl modifiedUrl = originalRequest.url().newBuilder()
                        //这个是拦截url并插入token参数
                        //.addQueryParameter("token", User.getUser().getToken())
                        .build();

                RequestBody body = originalRequest.body();  // 得到请求体
                Buffer buffer = new Buffer();               // 创建缓存
                body.writeTo(buffer);                       // 将请求体内容,写入缓存
                String parameterStr = buffer.readUtf8();    // 读取参数字符串
                //LogUtils.e("处理前的请求体内容:",parameterStr);

                //解析json(本人利用阿里的FastJSON)
                JSONObject jsonObject = JSONObject.parseObject(parameterStr);
				//重新加入参数(可以是任意固定参数)
                jsonObject.put("token",User.getUser().getToken());
                String newParameterStr = jsonObject.toString();
                //LogUtils.e("处理后的请求体内容:",newParameterStr);

                RequestBody requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), newParameterStr);

                request = originalRequest.newBuilder()
                        //.url(modifiedUrl)
                        .post(requestBody)
                        .build();

                return chain.proceed(request);

其他:

如果实现不了,首先得确定你的请求体是JSON格式的,如果不是方法如下:

/**
* @功能 将json格式转化为RequestBody格式,方便进行请求接口
*/
public static RequestBody translateJson(Object json) {
	return RequestBody.create(MediaType.parse("application/json"), json.toString());
}

调用:
	JSONObject jsonObject = new JSONObject();
    try {
        jsonObject.put("userid", 100);
		...
    } catch (JSONException e) {
        e.printStackTrace();
    }
    apiStores.getInfo(translateJson(jsonObject))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值