java Jersey客户端抛出“无法使用不可重复的请求实体重试请求”在代理上执行POST时
下面我将使用Jersey 2.25通过ApacheConnector代理执行POST请求。由于代理,如果我忽略配置:
config.property(ClientProperties.REQUEST_ENTITY_PROCESSING, RequestEntityProcessing.BUFFERED);
我将得到错误Caused by: org.apache.http.client.NonRepeatableRequestException: Cannot retry request with a non-repeatable request entity.
问题:用Jersey 2处理代理配置的正确方法是什么?对我来说,我的解决方案看起来像一堆乱七八糟的东西
package JerseyTest.one;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.Invocation.Builder;
import javax.ws.rs.core.MediaType;
import org.glassfish.jersey.apache.connector.ApacheConnectorProvider;
import org.glassfish.jersey.client.ClientConfig;
import org.glassfish.jersey.client.ClientProperties;
import org.glassfish.jersey.client.RequestEntityProcessing;
public class Requester {
public static String getPostResponseInOne(final String url, final String json) {
final ClientConfig config = new ClientConfig();
config.connectorProvider(new ApacheConnectorProvider());
config.property(ClientProperties.PROXY_URI, "http://proxyurl:8080");
config.property(ClientProperties.PROXY_USERNAME,"michael");
config.property(ClientProperties.PROXY_PASSWORD,"secret");
config.property(ClientProperties.REQUEST_ENTITY_PROCESSING, RequestEntityProcessing.BUFFERED);
final Client client = ClientBuilder.newClient(config);
final Builder builder = client.target(url).request(MediaType.APPLICATION_JSON);
final String response = builder.post(Entity.json(json), String.class);
return response;
}
}
# 1 楼答案
看起来像个虫子。实际上,这个布尔配置参数的作用是,它为
BufferedHttpEntity
创建一个新的字节数组,这是处理请求所需的您可以在jersey-apache-connector-2.22.4的
ApacheConnector
类中找到代码。jar在method getUriHttpRequest(...)