您当前的位置: 首页 >  服务器

鱼儿-1226

暂无认证

  • 0浏览

    0关注

    1100博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

鱼儿-1226 发布时间:2022-01-13 15:57:30 ,浏览量:0

本文只是记录作者学习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  

关注
打赏
1604459285
查看更多评论
立即登录/注册

微信扫码登录

0.0424s