代码之家  ›  专栏  ›  技术社区  ›  egervari

如何让ApacheHTTP客户机4.0.1(org.apache.httpcomponents)在发布后自动重定向到get?

  •  0
  • egervari  · 技术社区  · 15 年前

    根据文档,ApacheHTTP客户机应该自动重定向。我正在向服务器提交一个帖子,它有一个重定向。不幸的是,响应处理程序正在返回空字符串。它只是不遵循重定向,直接给我内容。有没有一种简单的方法让客户机遵循重定向?

    2 回复  |  直到 11 年前
        1
  •  1
  •   D.Shawley    15 年前

    你可能看到的结果是 RFC-2616 . 这个 Location 头用于根据确切的状态代码重定向客户端。有趣的是201、301、302和303。这个 对的 处理很大程度上取决于您接收的是哪一个。我猜你应该收到 303 See Other 你收到了一个不同的密码 您的客户机遵循各种HTTP规范。

    我不知道Apache的HTTP客户机的行为,但我知道许多服务器和客户机的实现都会出错。下面是RFC-2616的相关部分。我为这个冗长的回答道歉。

    10.2.2.201已创建

    请求已完成,并导致正在创建新资源。新创建的资源可以由响应实体中返回的URI引用,其中位置头字段为资源提供了最特定的URI。响应应该包括一个包含资源特征和位置列表的实体,用户或用户代理可以从中选择最合适的资源特征和位置。实体格式由“内容类型”标题字段中给定的媒体类型指定。源服务器必须在返回201状态代码之前创建资源。如果无法立即执行该操作,则服务器应改为响应202(已接受)。

    10.3.2.301永久移动

    已为请求的资源分配了新的永久URI,将来对此资源的任何引用都应使用返回的URI之一。具有链接编辑功能的客户机应该在可能的情况下自动将对请求URI的引用重新链接到服务器返回的一个或多个新引用。除非另有说明,否则此响应是可缓存的。

    新的永久URI应该由响应中的位置字段提供。除非请求方法是head,否则响应的实体应该包含一个简短的超文本注释,其中包含到新URI的超链接。

    如果收到301状态代码是为了响应GET或HEAD以外的请求,则除非用户可以确认,否则用户代理不得自动重定向请求,因为这可能会更改发出请求的条件。

    注意:当收到301状态代码后自动重定向POST请求时,一些现有的HTTP/1.0用户代理将错误地将其更改为GET请求。

    10.3.3.找到302

    请求的资源临时驻留在不同的URI下。由于重定向有时可能会被更改,客户机应该继续为将来的请求使用请求URI。只有当缓存控件或Expires头字段指示时,此响应才可缓存。

    临时URI应该由响应中的位置字段提供。除非请求方法是head,否则响应的实体应该包含一个简短的超文本注释,其中包含到新URI的超链接。

    如果收到302状态代码以响应GET或HEAD以外的请求,则除非用户可以确认,否则用户代理不得自动重定向请求,因为这可能会更改发出请求的条件。

    注意:RFC1945和RFC2068指定不允许客户端更改重定向请求的方法。但是,大多数现有的用户代理实现将302视为303响应,不管原始请求方法如何,都会对位置字段值执行get。对于希望明确地说明客户机应该做出何种反应的服务器,添加了状态代码303和307。

    10.3.4 303见其他

    对请求的响应可以在不同的URI下找到,并且应该使用该资源上的get方法进行检索。此方法主要用于允许激活后脚本的输出将用户代理重定向到选定的资源。新的URI不是最初请求的资源的替代引用。不能缓存303响应,但对第二个(重定向)请求的响应可能是可缓存的。

    响应中的位置字段应提供不同的URI。除非请求方法是head,否则响应的实体应该包含一个简短的超文本注释,其中包含到新URI的超链接。

    注意:许多HTTP/1.1之前的用户代理不了解303状态。当需要考虑与此类客户机的互操作性时,可以使用302状态代码,因为大多数用户代理都会对302响应做出响应,如本文针对303所述。

        2
  •  0
  •   user2009750    11 年前

    我试过使用ApacheHTTPComponents4.3.5,您必须指定重定向策略来遵循重定向。

    我就是这样做的。

    HttpClient httpClient = HttpClients.custom()
                    .setRedirectStrategy(new LaxRedirectStrategy())
                    .build();
    
    推荐文章