场景
当HTTP交互中,服务器端指定了application/x-www-form-urlencoded的Content-Type类型,需要对Body报文实体进行url编码。libcurl提供了curl_easy_escape
例子
static void TestPostOfRestfulInterfaceByUrlEncode()
{
CURL *pCurlHandle = curl_easy_init();
curl_easy_setopt(pCurlHandle, CURLOPT_CUSTOMREQUEST, "POST");
curl_easy_setopt(pCurlHandle, CURLOPT_URL, "http://192.168.10.85:8080/cs/restfull/operationRestfullApi/excuteSqlByCode");
struct curl_slist *pCurlList = NULL;
pCurlList = curl_slist_append(pCurlList, "Content-Type: application/x-www-form-urlencoded");//指定文本url编码
curl_easy_setopt(pCurlHandle, CURLOPT_HTTPHEADER, pCurlList);
Json::Value jsonAuthen;
jsonAuthen["loginAccount"] = "root";
std::string strAuth = jsonAuthen.toStyledString();
//对参数authorJson的内容:{ "loginAccount" : "root"} ,进行url编码
char* pszEncodeAuth = curl_easy_escape(pCurlHandle, strAuth.c_str(), strAuth.length());
std::string strEncodeAuth = pszEncodeAuth;
//释放申请的内存
curl_free(pszEncodeAuth);
Json::Value jsonContent;
jsonContent["operatorname"] = "PostName";
Json::Value jsonParams;
jsonParams["name"] = "fengyuzaitu";
jsonContent["params"] = jsonParams;
std::string strParams = jsonContent.toStyledString();
char* pszParams = curl_easy_escape(pCurlHandle, strParams.c_str(), strParams.length());
std::string strEncodeParams = pszParams;
curl_free(pszParams);
std::string strPostData = "authorJson=" + strAuth + "&parmJson=" + strParams;
curl_easy_setopt(pCurlHandle, CURLOPT_POSTFIELDS, strPostUrlEncodeData.c_str());
CURLcode nRet = curl_easy_perform(pCurlHandle);
if (0 == nRet)
{
std::cout << "Post message successfully" << std::endl;
}
curl_slist_free_all(pCurlList);
curl_easy_cleanup(pCurlHandle);
}
内容分析:
/*
没有经过url编码的原始数据如下:
authorJson={
"loginAccount" : "root"
}
&parmJson={
"operatorname" : "PostName",
"params" : {
"name" : "fengyuzaitu"
}
}
*/
std::string strPostUrlEncodeData = "authorJson=" + strEncodeAuth + "&parmJson=" + strEncodeParams;
/*
经过url编码的数据如下:authorJson=%7B%0A%20%20%20%22loginAccount%22%20%3A%20%22root%22%0A%7D%0A&parmJson=%7B%0A%20%20%20%22operatorname%22%20%3A%20%22PostName%22%2C%0A%20%20%20%22params%22%20%3A%20%7B%0A%20%20%20%20%20%20%22name%22%20%3A%20%22fengyuzaitu%22%0A%20%20%20%7D%0A%7D%0A
*/
注意:
目前在某个现场将2020-05/2020052715490000-0.jpg_2020-05/2020052715490000-0.jpg字符串通过urlencode编码之后,写库失败,一旦/编码之后入库失败,所以单独写了一个编码函数,取消对/的编码