libcurl post带参数请求

本文介绍如何使用CURL库中的curl_easy_escape和curl_escape函数进行URL参数的特殊字符转换,确保参数符合URL规范。并通过示例代码详细讲解如何设置POST请求参数,包括使用CURLOPT_POSTFIELDS选项和正确设置CURLOPT_POSTFIELDSIZE避免参数截断。

1、参数特殊字符转换

  curl_easy_escape函数及curl_escape函数都可以将参数中的所有不符合URL规定的字符转化为其对应的%XX 形式。
  curl_escape函数是旧的API,其内部调用的是curl_easy_escape函数只不过handle设置为NULL了。
两个函数调用返回的字符串都要调用curl_free或free函数释放。
在这里插入图片描述

2、设置post参数

  使用CURLOPT_POSTFIELDS添加post参数

  CURL *curl;
  CURLcode res;

  /* In windows, this will init the winsock stuff */
  curl_global_init(CURL_GLOBAL_ALL);

  /* get a curl handle */
  curl = curl_easy_init();
  if(curl)
  {
    char* raw_parame = "vhost=__defaltVhost__&app=proxy&stream=1_1&url=rtsp://admin:123456@192.168.2.157:554/cam/realmonitor?channel=1&subtype=0";
  	char* escap_param = curl_escape(raw_parame , strlen(raw_parame ));
  	curl_easy_setopt(curl, CURLOPT_URL, "http://postit.example.com/moo.cgi");
  	
    /* Now specify the POST data */
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, param );
    /* 长参数一定要设置CURLOPT_POSTFIELDSIZE,否则会截断 */
    curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, strlen(escap_param ));
    curl_easy_setopt(EasyCurlHandle, CURLOPT_VERBOSE, 1); /* 打开debug */
    res = curl_easy_perform(curl);
    /* Check for errors */
    if(res != CURLE_OK)
      fprintf(stderr, "curl_easy_perform() failed: %s\n",
              curl_easy_strerror(res));

    /* always cleanup */
    curl_easy_cleanup(curl);
	free(escap_param);
    
  }
  curl_global_cleanup();

3、使用CURLOPT_POSTFIELDS

在这里插入图片描述

虽然参考引用中未直接提及libcurl发送post请求传递json格式参数的具体方法,但可以结合对libcurl的一般性了解来阐述。 在C++里使用libcurlPOST方式发送JSON数据,大致步骤如下: 1. 初始化libcurl 2. 设置URL 3. 设置请求方式为POST 4. 设置请求头,指明内容类型为JSON 5. 设置POST数据,即JSON字符串 6. 执行请求 7. 清理资源 以下是示例代码: ```cpp #include <iostream> #include <curl/curl.h> // 回调函数,用于处理响应数据 size_t WriteCallback(void *contents, size_t size, size_t nmemb, std::string *s) { size_t newLength = size * nmemb; try { s->append((char*)contents, newLength); } catch(std::bad_alloc &e) { return 0; } return newLength; } int main() { CURL *curl; CURLcode res; std::string readBuffer; // 初始化libcurl curl = curl_easy_init(); if(curl) { // 设置URL curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/api"); // 设置请求方式为POST curl_easy_setopt(curl, CURLOPT_POST, 1L); // 设置JSON数据 std::string jsonData = "{\"key1\":\"value1\",\"key2\":\"value2\"}"; curl_easy_setopt(curl, CURLOPT_POSTFIELDS, jsonData.c_str()); // 设置请求头,指明内容类型为JSON struct curl_slist *headers = NULL; headers = curl_slist_append(headers, "Content-Type: application/json"); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); // 设置回调函数处理响应 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer); // 执行请求 res = curl_easy_perform(curl); // 检查请求是否成功 if(res != CURLE_OK) { std::cerr << "curl_easy_perform() failed: " << curl_easy_strerror(res) << std::endl; } else { std::cout << "Response: " << readBuffer << std::endl; } // 清理请求头 curl_slist_free_all(headers); // 清理curl句柄 curl_easy_cleanup(curl); } return 0; } ``` ### 代码解释: 1. **初始化libcurl**:使用`curl_easy_init()`初始化一个libcurl句柄。 2. **设置URL**:使用`curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/api")`设置请求的URL。 3. **设置请求方式为POST**:使用`curl_easy_setopt(curl, CURLOPT_POST, 1L)`将请求方式设置为POST。 4. **设置JSON数据**:将JSON数据存储在`std::string`中,然后使用`curl_easy_setopt(curl, CURLOPT_POSTFIELDS, jsonData.c_str())`设置POST数据。 5. **设置请求头**:使用`curl_slist_append`创建一个包含`Content-Type: application/json`的请求头,然后使用`curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers)`设置请求头。 6. **设置回调函数**:使用`curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback)`和`curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer)`设置回调函数来处理响应数据。 7. **执行请求**:使用`curl_easy_perform(curl)`执行请求。 8. **清理资源**:使用`curl_slist_free_all(headers)`清理请求头,使用`curl_easy_cleanup(curl)`清理curl句柄。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值