IdHTTP:EIdException ResponseCode(着色 + 替换)

IdHTTP: EIdException ResponseCode (Colorize + Replace)

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

  1. microsoft.com的响应码结果是一段时间HTTP/1.1 403 Forbidden or 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. 着色并替换 E.Message 错误的 EIdException / TListBox 中的异常。

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

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

    但是用那种方式,结果还是一样

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

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

302 Moved Temporarily 是 HTTP 重定向。 TIdHTTP.OnRedirect 事件将被触发,为您提供新的 URL。如果 TIdHTTP.HandleRedirects 属性 为真,或者 OnRedirect 事件处理程序 return 为真,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);
}