【问题标题】:WinInet HttpQuery Info returning Invalid Status CodesWinInet HttpQuery 信息返回无效状态代码
【发布时间】:2011-10-10 06:31:51
【问题描述】:

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

一切正常,但我无法让 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

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

谢谢!

【问题讨论】:

  • sizeof(DWORD) 给你什么?只是想知道这是否是某种奇怪的 64/32 位的东西。
  • 这不是DWORD本身的问题;它似乎与给我一个 0 的 1 字节字符数组的函数有关。

标签: c++ http wininet


【解决方案1】:

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

但是,HttpQueryInfo 的相同 Microsoft 文档也暗示,如果使用了 HTTP_QUERY_FLAG_NUMBER,您可以获得HTTP_QUERY_STATUS_CODEDWORD

以下代码 sn-p 向您展示了如何:

DWORD statusCode = 0;
DWORD length = sizeof(DWORD);
HttpQueryInfo(
    hRequestHandle,
    HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER,
    &statusCode,
    &length,
    NULL
);

【讨论】:

    【解决方案2】:

    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);
    

    【讨论】:

    • 感谢您的提示;但现在响应文本始终为零:/ 此外,responseTextSize 必须是 DWORD,但这不应该是导致问题的原因。
    • 如果您正在编译 Unicode,请将 char 更改为 wchar_t 以及 atoi()。我已经更新了我的答案以反映这一点以及解决您指出的问题;)
    • 几乎成功了;但 char 数组本身没有保存任何东西,缓冲区大小本身为 1,仍然包含 0。感谢您的意见,非常有帮助。
    • 如果你调用了 HttpOpenRequest 但忘记在它之后调用 HttpSendRequest,在调用 HttpQueryInfo 之前,你总是会得到一个零值的状态码。
    【解决方案3】:

    我最近才开始使用它 - 发现网络上的大多数示例都不适合我,即使是 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-09
      • 2021-03-08
      • 1970-01-01
      • 2022-10-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多