当前位置: 首页 > 知识库问答 >
问题:

使用CloseableHttpClient发布请求

许展鹏
2023-03-14

我正在尝试从一个简单的Java项目创建一个HTTP POST请求。

我需要通过两个请求保留会话和cookie,所以我选择了Apache HttpClient。

代码编译时没有错误,也没有运行,但返回的内容长度为零,我不明白为什么。

public class Test {

    private static final String CONTENT_TYPE = "Content-Type";
    private static final String FORM_URLENCODED = "application/x-www-form-urlencoded";

    public static void main(String[] args) {

        try {

            CloseableHttpClient httpClient = HttpClients.createDefault();

            BasicHttpContext httpCtx = new BasicHttpContext();
            CookieStore store = new BasicCookieStore();
            httpCtx.setAttribute(HttpClientContext.COOKIE_STORE, store);

            String url = "http://myhost:port/app/";
            String body = "my body string";

            HttpPost httpPost = new HttpPost(url);
            httpPost.setHeader(CONTENT_TYPE, FORM_URLENCODED);
            StringEntity entity = new StringEntity(body);

            httpPost.setEntity(entity);
            CloseableHttpResponse response = httpClient.execute(httpPost, httpCtx);
            HttpEntity respentity = response.getEntity();

            System.out.println("respentity: " + respentity);

            System.out.println("EntityUtils.toString(respentity): " + EntityUtils.toString(respentity));

            EntityUtils.consume(respentity);

            System.out.println("respentity: " + respentity);
            System.out.println("EntityUtils.toString(respentity): " + EntityUtils.toString(respentity));

        } catch (Exception ex) {
            ex.printStackTrace();
        }

    }

}

结果是:

respentity: [Content-Length: 0,Chunked: false]
EntityUtils.toString(respentity): 
respentity: [Content-Length: 0,Chunked: false]
EntityUtils.toString(respentity): 

更新:我发现响应状态是302(已找到),当我从邮递员那里做同样的请求时,它是200(OK)。

任何人都可以告诉我我的代码有什么问题吗?

谢谢

共有1个答案

诸葛柏
2023-03-14

默认情况下,仅自动跟踪导致重定向的 GET 请求。如果 POST 请求通过 HTTP 301 永久移动302 找到来应答,则不会自动跟踪重定向。

这由HTTP RFC 2616规定:

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

使用HttpClient 4.2(或更高版本),我们可以将重定向策略设置为LaxRedirectStrategy,此策略放宽了HTTP规范对POST方法自动重定向的限制。

因此,您可以使用如下方法创建< code>CloseableHttpClient实例:

private CloseableHttpClient createHttpClient() {
    HttpClientBuilder builder = HttpClientBuilder.create();
    return builder.setRedirectStrategy(new LaxRedirectStrategy()).build();
}

并使用它来管理POST请求。

 类似资料:
  • 问题内容: 我想使用wget将图片(使用身份验证令牌“ AUTH_1624582364932749DFHDD”)上传到远程服务器到“ test”文件夹。 该命令不起作用(授权失败),我想确保它与语法无关: 有什么建议么? 问题答案: Wget当前仅支持x-www-form-urlencoded数据。不是用于将文件作为表单附件传输,而是需要格式为的数据。 并以相同的方式工作:唯一的不同是,您可以在命

  • 问题内容: 我需要将JSON从客户端发布到服务器。我正在使用Python 2.7.1和simplejson。客户端正在使用请求。服务器是CherryPy。我可以从服务器获取硬编码的JSON(代码未显示),但是当我尝试将JSON POST到服务器时,出现“ 400 Bad Request”。 这是我的客户代码: 这是服务器代码。 有任何想法吗? 问题答案: 从Requests 2.4.2及更高版本开

  • 问题内容: 我一直在尝试从SO和其他站点上的大量示例中学习,但是我无法弄清楚为什么我一起学习的示例无法正常工作。我正在构建一个小型的概念验证应用程序,该应用程序可以识别语音并将其(文本)作为POST请求发送到node.js服务器。我确认了语音识别功能,并且服务器正在通过常规浏览器访问获得连接,因此我被认为是问题出在应用程序本身。我想念一些小而愚蠢的东西吗?没有引发任何错误,但是服务器从不识别连接。

  • 问题内容: 我读了一些将jsons发布到服务器的示例。 有人说: OkHttp是Java提供的HttpUrlConnection接口的实现。它提供用于编写​​内容的输入流,并且不知道(或不在乎)内容的格式。 现在,我想用名称和密码的参数对URL进行常规发布。 这意味着我需要自己将名称和值对编码为流? 问题答案: 当前接受的答案已过期。现在,如果您想创建一个发布请求并向其中添加参数,则应该使用Mul

  • 我正在尝试根据下面的代码提出帖子请求: 此请求不需要身份验证,也不需要登录和密码。在邮递员那里,我可以成功地提出请求,但当我尝试执行上述代码时,我得到了: 401未经授权 我在邮递员那里模拟了错误,它给了我下面的信息: 当我在Postman中将身份验证方法更改为“No Auth”时,请求运行良好。 我想我必须在代码中设置这个选项“No Auth”,但我不知道如何设置。 我这样做: 但错误仍在继续。

  • 我有个大麻烦。我必须将应用程序中的一些参数发布到URL。但是,当我试图在WebView对象中执行此操作时,它会向我报告一个异常,该异常表示“不受信任的证书”(该异常由WebViewClient onReceivedSslError()的重写中的方法报告)。如何才能与服务器正确握手?你能给我一些提示吗?我快疯了... 真的,真的谢谢... 编辑:这是我定义webview的方式 这就是我在WebVie