gpt4 book ai didi

c++ - cURL 网址编码困惑

转载 作者:行者123 更新时间:2023-11-30 04:48:54 25 4
gpt4 key购买 nike

我正在尝试对请求进行编码。请求如下:

https://www.overpass-api.de/api/interpreter?data=area["name"="Nicaragua"]["admin_level"="2"]->.boundaryarea;(node["type"="route"]["route"="bus"](area.boundaryarea);way["type"="route"]["route"="bus"](area.boundaryarea);>;relation["type"="route"]["route"="bus"](area.boundaryarea);>>;);out meta;

如您所见,您有很多特殊字符。如果我把这个 URL 给 curl,我不会处理它,因为有些字符。因此我决定用我自己的方法和 curl 的方法对 URL 进行编码。下面是使用 curl 编码的代码示例:

std::string d = ...;
CURL *curl = curl_easy_init();
if(curl) {
char *output = curl_easy_escape(curl, d.c_str(), d.length());
if(output) {
printf("Encoded: %s\n", output);
curl_free(output);
}
}

将对整个请求进行编码,结果类似于

https%3A%2F%2Fwww.overpass-api.de%2Fapi%2Finterpreter%3Fdata%3D ...

如果我随后尝试将它交给 curl 来处理它,它会抛出并说它无法解析主机,这对我来说很有意义。所以我决定检查 chrome 在编码时做了什么 - 感谢开发工具。这就是它的样子:

https://www.overpass-api.de/api/interpreter?data=area[%22name%22=%22Nicaragua%22][%22admin_level%22=%222%22]-%3E.boundaryarea;(node[%22type%22=%22route%22][%22route%22=%22bus%22](area.boundaryarea);way[%22type%22=%22route%22][%22route%22=%22bus%22](area.boundaryarea);%3E;relation[%22type%22=%22route%22][%22route%22=%22bus%22](area.boundaryarea);%3E%3E;);out%20meta;

如果我按原样将其 curl - 它会正确处理它。

为什么有些字符被编码而不是其余的?为什么 curl 以这种方式接受它?

编辑:更重要的是,我如何在我的代码中复制它?

最佳答案

您必须转义 URI 部分。看看 JavaScript 的 encodeURI()encode​URIComponent()功能,这是要走的路。

我正在使用以下函数,它模仿 JavaScript 的 encodeURIComponent,以便对各个部分进行编码

std::string encodeURIComponent(std::string const&value)
{
std::ostringstream oss;
oss << std::hex;
for(auto c : value){
int uc = static_cast<unsigned char>(c);
if(((0x30 <= uc) && (uc <= 0x39)) || ((0x41 <= uc) && (uc <= 0x5A)) || ((0x61 <= uc) && (uc <= 0x7A))){
oss << c;
continue;
}
switch(c){
case '-': oss << c; break;
case '_': oss << c; break;
case '.': oss << c; break;
case '!': oss << c; break;
case '~': oss << c; break;
case '*': oss << c; break;
case '\'': oss << c; break;
case '(': oss << c; break;
case ')': oss << c; break;
default:
oss << std::uppercase << '%' << std::setw(2) << uc << std::nouppercase;
break;
}
}
return oss.str();
}

关于c++ - cURL 网址编码困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55659559/

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