C++ libcurl HTTP POST请求向服务器发送json数据

本文只是记录作者学习c++ http已post请求发送数据
目录
编译准备
libcurl下载地址
编译生成三方库文件
工程属性设置
代码
需包含的库
构建HTTP报文头
代码生成
错误处理
结尾
编译准备
选择一个第三方库,我这里用的是 libcurl

libcurl下载地址
1.下载curl源代码,下载地址版本(7.73.0):https://curl.se/download/curl-7.73.0.zip)
如果想选择版本:http://curl.haxx.se/download

编译生成三方库文件
解压文件之后找到 curl-7.73.0\projects\Windows\VC15\lib文件夹下的 libcurl.vcxproj 文件,通过编译器打开,现支持编译器版本如下

打开工程之后设置为LIB Release/LIB Debug
我所使用的是Win32
编译生成的lib文件在 curl-7.73.0\build\Win32\VC15\LIB Release 该文件下

工程属性设置
命令行添加 -D CURL_STATICLIB
添加之后会在附加选项同步

代码
需包含的库
#pragma comment ( lib, "ws2_32.lib" )
#pragma comment ( lib, "winmm.lib" )
#pragma comment ( lib, "wldap32.lib" )
#pragma comment(lib, "Advapi32.lib")

#ifdef _DEBUG
#pragma comment(lib,"libcurld.lib")
#else
#pragma comment(lib,"libcurl.lib")
#endif

#include "../curl/curl.h" 
1
2
3
4
5
6
7
8
9
10
11
12
构建HTTP报文头
我在这里是通过postman获取的所发送的报文头
先用postman发送测试的报文
然后点击Code就可以获取到你所需要的报文头


代码生成
调用函数

int HttpPost(string host, string send, string & resp)
{
    CURL *curl;
    CURLcode res;
    char tmp_str[256] = { 0 };
    std::stringstream out;

    //HTTP报文头  
    struct curl_slist* headers = NULL;

    char url[50] = { 0 };
    strcpy(url, host.c_str());
    //AfxMessageBox(_T("开始"));
    curl = curl_easy_init();

    if (curl)
    {
        //构建json
        string jsonout = send;
        char sendchar[4096] = { 0 };
        char ret[4096] = { 0 };
        strcpy(sendchar, jsonout.c_str());
        GBKtoU8(sendchar, ret);//如果发送报文内没有中文字符则可以不转换
        jsonout = ret;
        
        //设置url
        curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST");
        curl_easy_setopt(curl, CURLOPT_URL, url);

        //设置http发送的内容类型为JSON
        //构建HTTP报文头  
        AfxMessageBox(StrToCstr(jsonout));

        headers = curl_slist_append(headers, "cache-control:no-cache");
        headers = curl_slist_append(headers, "Content-Type:application/json");
        
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);

                                                // 设置要POST的JSON数据
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, jsonout.c_str());
        curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, jsonout.size());//设置上传json串长度,这个设置可以忽略

                                                                      // 设置接收数据的处理函数和存放变量
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);//设置回调函数
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &out);//设置写数据
        res = curl_easy_perform(curl);//执行

        curl_slist_free_all(headers); /* free the list again */

         resp = out.str();//返回请求值 
        char reta[4096] = { 0 };
        UtfToGbk(resp.c_str(), reta);
        resp = reta;
        AfxMessageBox(StrToCstr(resp));

        /* always cleanup */
        curl_easy_cleanup(curl);
    }
    return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
UTF-8和GBK格式相互转换函数

void UtfToGbk(const char* utf8, char * gbk)
{
    int len = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, NULL, 0);
    wchar_t* wstr = new wchar_t[len + 1];
    memset(wstr, 0, len + 1);
    MultiByteToWideChar(CP_UTF8, 0, utf8, -1, wstr, len);
    len = WideCharToMultiByte(CP_ACP, 0, wstr, -1, NULL, 0, NULL, NULL);
    //char* str = new char[len+1];
    memset(gbk, 0, len + 1);
    //WideCharToMultiByte(CP_ACP, 0, wstr, -1, str, len, NULL, NULL);
    WideCharToMultiByte(CP_ACP, 0, wstr, -1, gbk, len, NULL, NULL);
    if (wstr) delete[] wstr;

    //return str;
}

void GBKtoU8(char gbkstr[], char *utf8str)
{
    int len_wchart;
    wchar_t *unicode;
    int len_utf8;

    len_wchart = MultiByteToWideChar(CP_ACP, 0, gbkstr, -1, NULL, 0);   //得到GBK=>UTF8后需要字符串长度
    unicode = (wchar_t *)malloc(len_wchart * sizeof(wchar_t)); //分配空间存储UNICODE中间结果
    MultiByteToWideChar(CP_ACP, 0, gbkstr, -1, unicode, len_wchart);        //GBK => UINCODE 
    len_utf8 = WideCharToMultiByte(CP_UTF8, 0, unicode, -1, NULL, 0, NULL, NULL);  //UINCODE=>UTF8需要的长度
    WideCharToMultiByte(CP_UTF8, 0, unicode, -1, utf8str, len_utf8, NULL, NULL);   //UNICODE => UTF8

    free(unicode);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
如果发送或者接收的报文内有中文字符则需要转换,不然会显示为乱码。
我现在所发送的报文格式UTF-8

错误处理
在release编译下会报如下错误
这时候我们在
项目->属性->c/c++ ->预处理器->预处理器,把 ;BUILDING_LIBCURL;HTTP_ONLY复制进去(注意不要丢了";")
这时候再编译则正常运行。

结尾
调用函数之后返回的报文,和用postman发送报文返回值一样,则代码完成接口测试通过,再继续整合代码。

本文所参考的为 https://blog.csdn.net/z550449054/article/details/78683976
 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: C++ libcurl是一个用于进行网络通信的开源库。它可以用来发送HTTP请求,包括POST请求,并且支持各种认证方式。在使用libcurl时,可以通过设置一系列选项来配置请求,比如设置请求的URL、请求数据、认证方式等。其中,curl_easy_setopt函数用于设置选项,比如设置POST请求、设置请求数据、设置URL等。\[1\]在使用libcurl发送HTTP请求时,可以使用用户名和密码进行认证,通过设置CURLOPT_USERPWD选项来指定用户名和密码,同时设置CURLOPT_HTTPAUTH选项来指定认证方式,比如使用基本认证或摘要认证。\[2\]在使用libcurl时,需要包含相应的库文件,并且可以构建HTTP报文头来发送请求。\[3\] #### 引用[.reference_title] - *1* *2* [C++ libcurl Digest Auth](https://blog.csdn.net/weixin_43803955/article/details/120133273)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [C++ libcurl HTTP POST请求服务器发送json数据](https://blog.csdn.net/qq_34150669/article/details/109748667)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值