于今腐草无萤火,终古垂杨有暮鸦。这篇文章主要讲述restful接口中指定application/x-www-form-urlencoded的问题相关的知识,希望能为你提供帮助。
application/x-www-form-urlencoded指定了发送的POST数据,要进行URL编码,但是前面的&
,=用在POST报文前面,作为参数的时候,是不需要进行编码的,可以直接跳过。例如:
loginusername=admin&
loginpassword=admin&
param={JSON报文}
对于前面的两个&
&
都不能进行编码,否则java后台无法正常解析出POST数据。目前JSON报文里面存在一个uri:
http://192.168.0.225:8080/kms/services/rest/dataInfoService/downloadFileid=00000001/temp001/097_5848300_10488&
token=7a57a5a7ffffffffc1a0316369671314
里面存在&
,如果没有进行URL编码的话,Java后台无法正常解析出报文
因此对以前的url编码函数进行了简单的处理
std::string UrlEncode(const std::string&
str)
{
std::string strTemp = "";
size_t length = str.length();
for (size_t i = 0;
i <
length;
i++)
{
/*
前面的&
用来对多个参数键值进行区分,不能进行编码,后面的&
必须进行编码
*/
if (i <
50 &
&
str[i] == ‘&
‘)
{
strTemp += str[i];
continue;
}
if (isalnum((unsigned char)str[i]) ||
(str[i] == ‘-‘) ||
(str[i] == ‘_‘) ||
(str[i] == ‘.‘) ||
(str[i] == ‘~‘) ||
(str[i] == ‘=‘))
strTemp += str[i];
else if (str[i] == ‘ ‘)
strTemp += "+";
else
{
strTemp += ‘%‘;
strTemp += ToHex((unsigned char)str[i] >
>
4);
strTemp += ToHex((unsigned char)str[i] % 16);
}
}
return strTemp;
}
50是一个大致的数字,目前暂时没有考虑其他的通用做法
【restful接口中指定application/x-www-form-urlencoded的问题】
推荐阅读
- Android Studio Plugins
- Jmeter录制手机APP脚本
- Spring MVC之@RequestMapping基本用法
- Struts2异常(HTTP Status 404 - There is no Action mapped for action name addBook.)
- android ——ListView
- android Toast的内容过长,如何居中显示?
- Egret打包App 短暂黑屏解决方案 (Egret4.1.0)
- Egret打包App修改App名称和图标 (Egret4.1.0)
- 教你如何使用android studio发布release 版本