如何在curl_easy_perform系列接口中使用CURLU_ALLOW_SPACE允许URL空格
问题解答
可以通过配置CURLU_ALLOW_SPACE允许URL中存在空格,该配置仅作用于libcurl的URL解析器流程,需要配合curl_url系列接口使用,无法直接通过给CURLOPT_URL传入带空格的原始字符串生效。
具体实现步骤
- 调用
curl_easy_init初始化请求easy句柄,同时调用curl_url()初始化URL解析句柄 - 调用
curl_url_set接口传入带空格的目标URL,同时携带CURLU_ALLOW_SPACE标志位,让解析器跳过空格拦截逻辑,完成URL合法解析 - 调用
curl_easy_setopt配置CURLOPT_CURLU参数,将解析完成的URL句柄绑定到请求easy句柄上 - 完成其他请求参数配置后调用
curl_easy_perform发起请求 - 请求结束后依次释放URL解析句柄、easy句柄
代码示例
#include <curl/curl.h> int main(void) { CURL *easy_handle = curl_easy_init(); CURLU *url_handle = curl_url(); if(easy_handle && url_handle) { // 传入带空格的URL,开启CURLU_ALLOW_SPACE允许解析 CURLUcode uc = curl_url_set(url_handle, CURLUPART_URL, "https://example.com/path name with space", CURLU_ALLOW_SPACE); if(uc == CURLUE_OK) { // 绑定解析完成的URL句柄到请求 curl_easy_setopt(easy_handle, CURLOPT_CURLU, url_handle); // 其他常规请求配置可正常添加 curl_easy_setopt(easy_handle, CURLOPT_FOLLOWLOCATION, 1L); curl_easy_setopt(easy_handle, CURLOPT_TIMEOUT, 10L); // 发起请求 CURLcode res = curl_easy_perform(easy_handle); if(res != CURLE_OK) { fprintf(stderr, "请求执行失败: %s\n", curl_easy_strerror(res)); } } else { fprintf(stderr, "URL解析失败: %s\n", curl_url_strerror(uc)); } // 释放资源 curl_url_cleanup(url_handle); curl_easy_cleanup(easy_handle); } return 0; }
注意事项
- 仅libcurl 7.78.0及以上版本支持
CURLU_ALLOW_SPACE配置,低版本无法使用该方案 - 开启配置后libcurl会自动将URL中的空格编码为
%20再发起请求,符合HTTP协议规范,不会直接传输原始空格 - 跳过URL解析流程直接给
CURLOPT_URL传入带空格的原始字符串,依旧会触发默认的空格拦截逻辑报错
内容的提问来源于stack exchange,提问作者Magnus Håkansson
相关产品推荐
相关产品推荐

