我是 C 新手,我正在嘗試使用ip-api.comAPI 來獲取基于 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;
}
uj5u.com熱心網友回復:
除了您完全沒有任何錯誤處理之外,您的代碼的主要問題是您無法將 URL 傳遞給InternetConnect()and HttpOpenRequest(),就像您正在做的那樣。
您需要將 URL 分解為其組成部分(請參閱 參考資料InternetCrackUrl())——即:方案、主機名、埠和路徑——然后根據需要將方法部分傳遞給每個函式:
InternetConnect()需要服務器的主機名和埠(即"ip-api.com"和"80"),以及INTERNET_FLAG_SECURE連接到 HTTPS 服務器時的標志。HttpOpenRequest()想要資源在服務器上的路徑(即"/json/168.197.155.244")。
或者,您可以InternetOpenUrl()改用。在這種情況下,您根本不需要使用HttpOpenRequest()and HttpSendRequest()(順便說一句,您的使用HttpAddRequestHeaders()可以完全洗掉,因為您沒有向服務器發送任何資料,因此無需Content-Type在請求中添加標頭) . 有關詳細資訊,請參閱WinInet 檔案中的處理統一資源定位器。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/489220.html
標籤:C 视觉工作室 葡萄酒网 windows-11
上一篇:型別名稱不允許(轉換)
