0

我这里有两个问题。所以我需要你的帮助。

  1. microsoft.com 响应代码的结果是某个时间 HTTP/1.1 403 Forbidden 或 HTTP/1.1 200 OK。

    try 
    {
        IdHTTP->Get("http://www.microsoft.com");
        ListBox->Items->Add(IdHTTP->Response->ResponseCode);
    }
    catch (const EIdException &E) 
    {
        ListBox->Items->Add(E.Message);
        ListBox->Items->Add(IdHTTP->Response->ResponseText);
    }
    

    但是当我检查它时,http://web-sniffer.net/http://tools.seobook.com/server-header-checker的结果是HTTP/1.1 302 Moved Temporarily.

    为什么 IdHTTP 的结果与上面的两个 url 不同?IdHTTP 如何实现相同的 http 状态码?

  2. 着色并替换 TListBox 中 EIdException / Exception 的 E.Message 错误。

    例如,我想"Socket Error # 10061Connection refused""your connection is refused".

    ListBox->Items->Add(StringReplace(E.Message,"Socket Error # 10061Connection refused.","your connection is refused.",TReplaceFlags()<<rfReplaceAll));
    

    但是使用这种方式,结果仍然相同。

感谢您抽时间阅读。任何帮助或建议将不胜感激!

4

1 回答 1

0

在站点维护之外,我怀疑在正常情况下http://www.microsoft.com会返回错误。403 Forbidden但是,就像任何网站一样,我想它有时发生。这是一个致命错误,您当时无法访问该 URL(如果有的话)。

302 Moved Temporarily是一个 HTTP 重定向。将触发该TIdHTTP.OnRedirect事件以向您提供新 URL。如果该TIdHTTP.HandleRedirects属性为 true,或者OnRedirect事件处理程序返回 true,TIdHTTP则会在内部处理重定向并自动为您请求新 URL。 TIdHTTP.Get()在到达最终 URL 或发生错误之前不会退出。

至于错误处理,如果要根据发生的错误类型自定义显示的消息,则需要实际区分可能发生的各种错误类型,例如:

try 
{
    IdHTTP->Get("http://www.microsoft.com");
    ListBox->Items->Add(IdHTTP->Response->ResponseCode);
}
catch (const EIdHTTPProtocolException &E) 
{
    // HTTP error
    // E.ErrorCode contains the ResponseCode
    // E.Message contains the ResponseText
    // E.ErrorMessage contains the content of the error body, if any

    ListBox->Items->Add(E.Message);
}
catch (const EIdSocketError &E)
{
    // Socket error
    // E.LastError contains the socket error code
    // E.Message contains the socket error message

    if (E.LastError == Id_WSAECONNREFUSED)
        ListBox->Items->Add("Your connection is refused");
    else
        ListBox->Items->Add(E.Message);
}
catch (const EIdException &E) 
{
    // any other Indy error
    ListBox->Items->Add(E.Message);
}
catch (const Exception &E) 
{
    // any other non-Indy error
    ListBox->Items->Add(E.Message);
}
于 2015-09-20T06:07:12.247 回答