標籤:restful & application/x-www-form-urlencoded
application/x-www-form-urlencoded指定了發送的POST資料,要進行URL編碼,但是前面的&,=用在POST報文前面,作為參數的時候,是不需要進行編碼的,可以直接跳過。例如:
loginusername=admin&loginpassword=admin¶m={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的問題