首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用C++中的wininet从web上获取json的数据?

如何使用C++中的wininet从web上获取json的数据?
EN

Stack Overflow用户
提问于 2022-06-10 16:07:49
回答 1查看 106关注 0票数 -1

我是C++新手,我尝试使用ip-api.com API来获取基于IP号的地理位置。但我不能正确地提出请求。为了获得正确的JSON响应,我可以在这段代码中更改什么?

代码语言:javascript
运行
复制
string GetLocation() {
    DWORD size = 0;
    DWORD wrt;
    LPCWSTR down = L"Downloader";
    string msg = "";

    /*wstring ipConvert(ipAdr().begin(), ipAdr().end());
    LPCWSTR ip = ipConvert.c_str();*/

    string url = "http://ip-api.com/json/168.197.155.244";
    wstring urlConvert(url.begin(), url.end());
    LPCWSTR urlFinal = L"http://ip-api.com/json/168.197.155.244";
    LPCWSTR headers = L"Content-Type: application/json\r\n";


    HINTERNET open = InternetOpen(down, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
    HINTERNET connect = InternetConnect(open, urlFinal, NULL, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);
    HINTERNET request = HttpOpenRequest(connect, NULL, urlFinal, NULL, NULL, 0, 0, 0);
    HttpAddRequestHeaders(request, headers, -1, HTTP_ADDREQ_FLAG_ADD);

    HttpSendRequest(request, NULL, 0, NULL, 0);
    InternetQueryDataAvailable(request, &size, 0, 0);
    char* buff = new char[size + 1];
    memset(buff, 0, size + 1);

    InternetReadFile(request, buff, size, &wrt);
    msg += buff;

    InternetCloseHandle(open);
    InternetCloseHandle(connect);
    InternetCloseHandle(request);

    return msg;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-10 20:39:08

除了您完全缺乏任何错误处理之外,代码的主要问题是无法像您正在做的那样将一个URL传递给InternetConnect()HttpOpenRequest()

您需要将URL分解为其组成部分(参见InternetCrackUrl()),即:方案、主机名、端口和路径,然后根据需要将方法块传递给每个函数:

  • InternetConnect()需要服务器的主机名和端口(即"ip-api.com""80"),以及连接到HTTPS服务器时的INTERNET_FLAG_SECURE标志。
  • HttpOpenRequest()需要服务器上的资源路径(即"/json/168.197.155.244")。

或者,您可以使用InternetOpenUrl()代替。在这种情况下,您根本不需要使用HttpOpenRequest()HttpSendRequest() (和BTW,您可以完全删除对HttpAddRequestHeaders()的使用,因为您没有向服务器发送任何数据,因此不需要向请求添加Content-Type头)。有关这一点的更多细节,请参阅WinInet文档中的统一资源定位器的处理

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72577158

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档