【问题标题】:How to redirect Post requests using TIdHTTPProxyServer如何使用 TIdHTTPProxyServer 重定向 Post 请求
【发布时间】:2012-06-05 07:17:17
【问题描述】:

目前我想使用 Indy10 TIdHTTPProxyServer 重定向特定的 Post 请求。我关注了页面

http://embarcadero.newsgroups.archived.at/public.delphi.internet.winsock/200904/0904301714.html

并写了一个简单的示例如下。

oid __fastcall TForm3::MyProxyHTTPBeforeCommand(TIdHTTPProxyServerContext *AContext)
{

    if (AContext->Target == "http://example.com/need_redirect_url" ) {

        TIdIOHandler* io = AContext->Connection->IOHandler;

        io->WriteLn("HTTP/1.0 302 Moved Temporarily");
        io->WriteLn("Location:  http://exampledomain.com/target_url");
        io->WriteLn("Connection: close");    
    }
}

如果我将“http://sample.com/need_redirect_url”按到浏览器的 URL 栏中,它会起作用。 但是,如果它是针对同一 URL 的 XMLHttpRequest,则不返回任何内容(无论是 Post 还是 Get)。

我不得不承认我真的不熟悉 HTTP 的工作原理。而且我也想知道是否有更好的方法来做我想做的事。

虽然我使用的是 C++Builder XE2。 Delphi 示例也受到赞赏,因为使用 C++ 使用 indy 组件的示例较少

【问题讨论】:

    标签: c++ delphi indy10 c++builder-xe2


    【解决方案1】:

    您的代码没有写一个空行来终止您发送的 HTTP 标头。您还需要引发异常以防止 TIdHTTPProxyServer 在 OnBeforeCommand 事件处理程序退出后导航到客户端请求的 URL。

    试试这个:

    void __fastcall TForm3::MyProxyHTTPBeforeCommand(TIdHTTPProxyServerContext *AContext) 
    { 
        if (AContext->Target == "http://xxx.com/need_redirect_url" )
        { 
            TIdIOHandler* io = AContext->Connection->IOHandler; 
    
            io->WriteLn("HTTP/1.0 302 Moved Temporarily"); 
            io->WriteLn("Location: http://mydomain.com/target_url"); 
            io->WriteLn("Connection: close");     
            io->WriteLn("");     
    
            Abort();
        } 
    } 
    

    【讨论】:

    • 非常感谢。目前我可以在代理中成功收到预期的响应。然而还有另一个问题。 Post 请求重定向后变为 Get 请求。当是 Post 请求时,我应该做其他事情吗?
    • 将POST 请求更改为GET 请求只是一些HTTP 客户端(错误地)在接收到302 响应时所做的事情。此行为在RFC 2616 Section 10.3.3 中进行了描述。对于 HTTP 1.1 请求,请改用303 来保留POST。
    • 谢谢,虽然在我使用“HTTP/1.1 303 See Other”之后它仍然无法正常工作。我不太确定这是代理问题还是用户代理问题。对于这个问题,我想你已经给了我一个完美的答案。 (不过我还是想知道为什么 303 也不起作用..)
    • 我的错。 303 应该将重定向转换为 GET。请改用307,它应该保留原始请求。
    【解决方案2】:

    这看起来像是一个XMLHttpRequest 跨域策略问题,因为example.com != mydomain.com - 有关背景信息和潜在解决方案,请参阅http://en.wikipedia.org/wiki/XMLHttpRequest#Cross-domain_requests

    【讨论】:

    • 感谢您的回复。我不确定这是一个跨域问题,因为我也没有在代理中收到预期的响应。此外,我已经在 IE8 中使用了 XMLDomainRequest,并且当请求的目标是 mydomain.com/target_url 时它工作得很好
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-10
    • 2020-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多