为了账号安全,请及时绑定邮箱和手机立即绑定

添加基本​​身份验证后的 NonRepeatableRequestException

添加基本​​身份验证后的 NonRepeatableRequestException

一只甜甜圈 2021-08-13 16:59:31
我正在使用最新的 apache http:<dependency>    <groupId>org.apache.httpcomponents</groupId>    <artifactId>httpclient-osgi</artifactId>    <version>4.5.6</version></dependency><dependency>    <groupId>org.apache.httpcomponents</groupId>    <artifactId>httpcore-osgi</artifactId>    <version>4.4.10</version></dependency>我有以下操作:public void store(InputStream input) throws IOException {    HttpClientBuilder builder = HttpClientBuilder.create();    if (StringUtils.isNotBlank(username)) {      CredentialsProvider provider = new BasicCredentialsProvider();      UsernamePasswordCredentials credentials = new UsernamePasswordCredentials(username.trim(), StringUtils.trimToEmpty(password));      provider.setCredentials(AuthScope.ANY, credentials);      builder.setDefaultCredentialsProvider(provider);    }    HttpClient client = builder.build();    HttpPost post  = new HttpPost(uri);    post.setEntity(new InputStreamEntity(input));    HttpResponse response = client.execute(post);}   在基本身份验证处于活动状态之前,一切正常,但是,在添加基本身份验证后,我收到以下错误:引起:org.apache.http.client.NonRepeatableRequestException:无法使用不可重复的请求实体重试请求。在 org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:226) 在 org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:185) 在 org.apache.http.impl .execchain.RetryExec.execute(RetryExec.java:89) at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:111) at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient) .java:185) ... 6 更多我发现了以下错误报告:https://github.com/http-builder-ng/http-builder-ng/issues/10,但是它被分配给另一个问题。导致错误的原因是什么?如何在 apache httpclient 中使用基本身份验证?我不知道什么是“可重复的 HTTP 请求”,据我所知,客户端需要设置的只是 Authorization 标头。我是否可能在服务器上错误配置了某些内容,因此它需要“可重复”的 HTTP 请求?
查看完整描述

2 回答

?
千万里不及你

TA贡献1784条经验 获得超9个赞

我不同意 OP 自己的解决方案,因为它在某种程度上非常骇人听闻,并且绕过了库的凭证机制。

HTTP 实体有多种实体类型,如此处所述。因此,既然您知道,您不能在您的场景中使用可重复实体,那么如何使用自包含实体或使用缓冲区的包装器。

您可以使用单线来实现这一点。没有尝试过,我认为正确的解决方案是:

post.setEntity(new BufferedHttpEntity(new InputStreamEntity(input)));


查看完整回答
1 反对 回复 2021-08-13
  • 2 回答
  • 0 关注
  • 230 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信