我是C++新手,我尝试使用ip-api.com
API来获取基于IP号的地理位置。但我不能正确地提出请求。为了获得正确的JSON响应,我可以在这段代码中更改什么?
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;
}
发布于 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文档中的统一资源定位器的处理。
https://stackoverflow.com/questions/72577158
复制相似问题