使用RxVolley框架请求网络,发送参数为json格式的post请求,遇到的一些小问题

事发经过

最近在实现一个机器人聊天的功能,因为想偷懒,于是网络方面就采用了RxVolley框架来实现。接口采用的是图灵聊天机器人。但是在实现的时候,发现,图灵聊天机器人api升级之后采用了比较复杂的json请求body,安装一些网上的教程写的请求代码没办法得到正确的返回值,于是决定自己研究研究。

出现错误的代码

一开始的代码是这样的:

params.putJsonParams("{\n" +
                    "\t\"reqType\":0,\n" +
                    "    \"perception\": {\n" +
                    "        \"inputText\": {\n" +
                    "            \"text\": \""+"附近的酒店"+"\"\n" +
                    "        },\n" +
                    "        \"inputImage\": {\n" +
                    "            \"url\": \"imageUrl\"\n" +
                    "        },\n" +
                    "        \"selfInfo\": {\n" +
                    "            \"location\": {\n" +
                    "                \"city\": \""+"北京"+"\",\n" +
                    "                \"province\": \""+"北京"+"\",\n" +
                     "                \"street\": \""+"信息路"+"\"\n" +
                     "            }\n" +
                     "        }\n" +
                    "    },\n" +
                    "    \"userInfo\": {\n" +
                    "        \"apiKey\": \""+StaticClass.CHAT_ROBOT_KEY+"\",\n" +
                    "        \"userId\": \""+"user03"+"\"\n" +
                    "    }\n" +
                    "}");
            RxVolley.post(url, params, new HttpCallback() {
                @Override
                public void onSuccess(String t) {
                    Toast.makeText(getActivity(), t, Toast.LENGTH_LONG).show();
                    L.e(t);//用于打印log的工具类
                }
            });

代码是直接用api文档的示例代码来请求,只是加上自己的key,但是返回的结果却报错,提示参数不正确:
在这里插入图片描述
RxVolley的官方文档里面也没有对json格式的post请求做特别的说明,只有下面这个简单的例子在这里插入图片描述
于是我参考着写代码就有了最开始的代码。

排查过程

我的电脑上面装了一个Psotman的Chrome插件,这是一个非常好用的测试接口的插件。在这里插入图片描述
按上图这样操作,我发现,json没毛病,接口返回也没有毛病,那肯定是我写的程序有问题了。

真相浮出水面

问题肯定出现在RxVolley帮我做的事情上面,一个成熟的框架,是不可能出现问题的,肯定是我使用不当,所以我决定先看看它的源码,看看这个框架具体帮我做了什么?在这里插入图片描述
在这里插入图片描述
点进去HttpParams类的源码一看,真相大白。其实putJsonParams这个方法,只是帮我们把HttpParams对象的jsonParams这个属性赋值了。在后期调用post请求的时候,json格式的请求头是会有不同的,这一点在Postman测试的时候已经帮我们自动生成了(下图)。
在这里插入图片描述
但是RxVolley框架没有做这个事情,我一开始猜测它会在post方法里面会对jsonParams进行一个判空,如果不为空就加上请求头的字段,结果显然它没有做这个操作。于是我在RxVolley这个类里面搜索json,结果找到了一个方法:jsonPost()。这下子就真相大白了。设置了json格式的params之后,就不能调用post方法了,要调用jsonPost,其余部分不变,然后就成功了。

当然,还有另外一个方法:
就是手动给这个params对象加上请求头部参数:

 params.putHeaders("Content-Type","application/json");

下一步首先将json请求转换成String再转换成字节数组b
然后给params对象传入一个key为body,值是字节数组b的参数,这样子用post方法请求,照样可以得到正确的返回值。

总结

框架毕竟是别人写的,有点时候文档还写得不怎么样,不妨点进去看看源码,注释,很多东西就明白了。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值