gpt4 book ai didi

c++ - 为 cURL 转义 url 参数

转载 作者:行者123 更新时间:2023-11-28 01:44:22 35 4
gpt4 key购买 nike

我有一个这样的网址:

http://localhost:3000/get_agencies?zipcodecity=&zipcode=30048&city=kraków&

如您所见,city 参数等于 kraków。当我将这样的 URL 传递给 curl 时,我收到了它以某种方式以不适当的方式编码:

curl = curl_easy_init();
// Some code here
curl_easy_setopt(curl, CURLOPT_URL, url);

在服务器端,我得到 city=kraków。我尝试使用 curl_easy_escape(curl, url, strlen(url)); 但它只是对所有内容进行编码。那么如何才能仅解析查询字符串的参数值呢?

最佳答案

(抱歉,要么您对原始问题进行了大量编辑,要么我第一次读错了,让我再试一次)

好吧,我猜你可以修复它,根据 =& 字符猜测数据名称和值的开始和结束位置。它不是万无一失的,如果 &? 编码错误,或者如果你遇到一个 unicode 字符使用等效字节作为它们的字符(编辑:这最后一部分可以通过切换来修复到 unicode 字符串搜索函数),这还不够,但除了这两种情况外,像这样的东西应该可以工作:

std::string patchInappropriatelyEncodedURL(CURL *curl, std::string url){
size_t pos=url.find("?");
size_t pos2;
if(pos==url.npos){
return url;
}
std::string ret=url.substr(0,pos+1);
std::string tmpstr;
char *escapedstr;
url=url.substr(pos+1,url.npos);
std::string type="=";
do{
pos=url.find("=");
pos2=url.find("&");
if(pos == url.npos && pos2 == url.npos){
break;
}
if(pos<pos2){
type="=";
}else{
type="&";
pos=pos2;
}
tmpstr=url.substr(0,pos);
url=url.substr(pos+1,url.npos);
escapedstr=curl_easy_escape(curl,tmpstr.c_str(),tmpstr.length());
ret.append(escapedstr);
ret.append(type);
curl_free(escapedstr);
}while(true);
escapedstr=curl_easy_escape(curl,url.c_str(),url.length());
ret.append(escapedstr);
curl_free(escapedstr);
return ret;
}
  • 请注意,此函数是基于猜测的,绝不是万无一失的。我想猜测可以通过你的目标语言的字典或其他东西来改进,但你的时间可能会更好地花在修复错误上,导致你首先在你的程序中收到格式错误的 url。

  • 我故意省略了错误检查,因为我很懒。 curl_easy_escape 可能会失败(内存不足),当失败时,它会返回一个 nullptr。你应该在代码投入生产之前修复它,我太懒了。

  • 你应该将那些 curl_free 放在 finally{} block 中,否则如果字符串函数抛出异常(比如 substr 可能抛出 bad_alloc 异常),你可能会遇到内存泄漏,但同样,我懒得修复它.

关于c++ - 为 cURL 转义 url 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45761688/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com