WinInet HttpQuery信息返回无效状态码

WinInet HttpQuery Info returning Invalid Status Codes

本文关键字:状态 无效 返回 HttpQuery 信息 WinInet      更新时间:2023-10-16

我正在编写一个程序,该程序需要在加载页面之前检查页面是否存在(所以没有什么太奇怪的)。

一切工作正常,但我不能得到HttpQueryInfo返回一个页面的有效状态码。返回的状态码为:1875378224

产生问题的代码:
DWORD headerBuffSize = sizeof(DWORD);
DWORD statusCode;
//Check existance of page (for 404 error)
if(!HttpQueryInfo(hRequestHandle,
                  HTTP_QUERY_STATUS_CODE,
                  &statusCode,
                  &headerBuffSize,
                  NULL))
    return 4;
if(statusCode == HTTP_STATUS_NOT_FOUND)
    cout << "We got a 404 error" << endl;
cout << "Got Status code: " << statusCode << endl; //1875378224 everywhere
cout << "404 status code: " << HTTP_STATUS_NOT_FOUND << endl; //What it should be getting

我不知道该怎么做;我将自己的代码与网上的几个示例进行了比较,看起来应该可以工作,尽管我可能刚刚犯了一个愚蠢的错误。

谢谢!

正如其他人指出的那样,HttpQueryInfo将请求的信息作为字符串返回。您需要确保您有一个足够大的缓冲区来检索字符串,并且,它将由您的应用程序释放它。

然而,HttpQueryInfo的相同微软文档也提示,如果使用HTTP_QUERY_FLAG_NUMBER,则可以为HTTP_QUERY_STATUS_CODE获得DWORD

下面的代码片段向您展示了如何:
DWORD statusCode = 0;
DWORD length = sizeof(DWORD);
HttpQueryInfo(
    hRequestHandle,
    HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER,
    &statusCode,
    &length,
    NULL
);

HttpQueryInfo从响应头中检索的信息始终是一个文本字符串。

int statusCode;
char responseText[256]; // change to wchar_t for unicode
DWORD responseTextSize = sizeof(responseText);
//Check existance of page (for 404 error)
if(!HttpQueryInfo(hRequestHandle,
                  HTTP_QUERY_STATUS_CODE,
                  &responseText,
                  &responseTextSize,
                  NULL))
    return 4;
statusCode = atoi(responseText);

我最近才得到这个工作-发现网络上的大多数例子都不适合我,甚至是MSDN上的(可能是因为我的c++现在很生锈,我正在犯简单的错误)。这就是我的工作:

LPVOID lpOutBuffer = NULL;
DWORD dwSize = 0;
while (!HttpQueryInfo(hRequest, HTTP_QUERY_STATUS_CODE, (LPVOID)lpOutBuffer, &dwSize, NULL))    
{
    DWORD dwError = GetLastError();
    if (dwError == ERROR_INSUFFICIENT_BUFFER)
    {
        lpOutBuffer = new wchar_t[dwSize];  
    }
    else
    {
        fprintf(stderr, "HttpQueryInfo failed, error = %d (0x%x)n",
            GetLastError(), GetLastError());
        break;
    }
}
wchar_t* outBuffer = (wchar_t*)lpOutBuffer;
std::wcout << L"Status_Code: " << outBuffer;
int status_code = _wtoi(outBuffer);
delete[] lpOutBuffer;