weixin_46027762 2023-08-07 17:26 采纳率: 64.7%
浏览 23
已结题

c++http客户端发送怎么写

就是我想用c++的http进行发送数据,比如说像http://127.0.0.1:7999/api/fun1发送数据,应该怎么写我看别人写的使用#include <wininet.h>,#include <json/json.h>这两个,代码

#include <windows.h>
#include <wininet.h>
#include <json/json.h>
#include <iostream>
using namespace Json;
#pragma comment(lib, "wininet.lib")

int main() {
    HINTERNET hInternet, hConnect;
    DWORD bytesRead;
    char buffer[4096];

    // 初始化WinINet库
    hInternet = InternetOpenA("MyApp", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
    if (hInternet == NULL) {
        std::cerr << "InternetOpenA failed!" << std::endl;
        return 1;
    }

    // 打开HTTP连接
    hConnect = InternetOpenUrlA(hInternet, "http://127.0.0.1:7999/api/fun1", NULL, 0, INTERNET_FLAG_RELOAD, 0);
    if (hConnect == NULL) {
        std::cerr << "InternetOpenUrlA failed!" << std::endl;
        InternetCloseHandle(hInternet);
        return 1;
    }

    // 构建JSON数据
    Json::Value jsonData;
    jsonData["key1"] = "value1";
    jsonData["key2"] = "value2";
    std::string postData = jsonData.toStyledString();

    // 发送POST数据
// 发送POST数据
    if (!InternetWriteFile(hConnect, postData.c_str(), postData.length(), &bytesRead)) {
        DWORD error = GetLastError();
        char errorBuffer[4096];
        DWORD bufferSize = sizeof(errorBuffer);
        if (InternetGetLastResponseInfoA(&error, errorBuffer, &bufferSize)) {
            std::cerr << "InternetWriteFile failed! Error: " << error << ", Response: " << errorBuffer << std::endl;
        }
        else {
            std::cerr << "InternetWriteFile failed! Error: " << error << std::endl;
        }
        InternetCloseHandle(hConnect);
        InternetCloseHandle(hInternet);
        return 1;
    }


    // 读取响应数据
    while (InternetReadFile(hConnect, buffer, sizeof(buffer), &bytesRead) && bytesRead > 0) {
        // 在这里处理响应数据,例如打印到控制台
        std::cout.write(buffer, bytesRead);
    }

    // 关闭连接和WinINet库
    InternetCloseHandle(hConnect);
    InternetCloseHandle(hInternet);

    return 0;
}

使用这个发送的时候,报错的是InternetWriteFile failed! Error,但是服务器那边接受到了数据,只是没有消息体,并且使用postman是可以发送成功的,应该怎么修改

  • 写回答

14条回答 默认 最新

  • juer_0001 2023-08-07 19:00
    关注
    
    #include <iostream>
    #include <string>
    #include <curl/curl.h>
    
    size_t WriteCallback(void *contents, size_t size, size_t nmemb, std::string *s) {
        size_t newLength = s->length() + size*nmemb;
        char *newStr = new char[newLength];
        delete[] s->data();
        s->assign(newStr, newLength);
        return size*nmemb;
    }
    
    int main(void) {
        CURL *curl;
        CURLcode res;
        std::string s = "";
    
        curl_global_init(CURL_GLOBAL_DEFAULT);
        curl = curl_easy_init();
        if(curl) {
            curl_easy_setopt(curl, CURLOPT_URL, "http://example.com"); // 修改为你的URL
            curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
            curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s);
            res = curl_easy_perform(curl);
            if(res != CURLE_OK) {
                fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
            }
            curl_easy_cleanup(curl);
        }
        curl_global_cleanup();
    
        std::cout << s << std::endl;
        return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(13条)

报告相同问题?

问题事件

  • 系统已结题 8月16日
  • 已采纳回答 8月8日
  • 创建了问题 8月7日

悬赏问题

  • ¥15 安霸cv22 + rtl8211f 千兆,udp传输丢包
  • ¥15 关于区块链和边缘环境搭建的相关问题
  • ¥15 windows远程桌面断卡重连软件卡顿问题
  • ¥30 Unity 实现扫描效果
  • ¥15 HbuilderX检测不到安卓模拟器
  • ¥15 这个main已经在filename.obj中定义是什么错 C语言
  • ¥15 关于#linux#的问题:exsi8.0系统 怎么更改web访问端口,不用80、443
  • ¥15 使用elementor设计样式
  • ¥15 谁能提供一个中文版的推销咨询网站连接?
  • ¥15 springboot项目程序启动报错