泽西http客户端自定义请求方法

问题描述 投票:6回答:2

使用以下代码,使用jersey

    <groupId>com.sun.jersey.contribs</groupId>
    <artifactId>jersey-apache-client4</artifactId>
    <version>1.13-b01</version>

我有使用自定义请求方法的问题,如FOOBAR,PATCH,SEARCH等。这些在httpUrlConnection中不存在。

 DefaultClientConfig config = new DefaultClientConfig();
 config.getProperties().put(URLConnectionClientHandler.PROPERTY_HTTP_URL_CONNECTION_SET_METHOD_WORKAROUND, true);

 Client c = Client.create(config);
 Form f = new Form();
 f.add("id", "foobar");

 WebResource r = c.resource("http://127.0.0.1/foo");
 String methodName = "foobar";
 String response = r.type(MediaType.APPLICATION_FORM_URLENCODED_TYPE).accept(MediaType.APPLICATION_JSON_TYPE).header("USER-AGENT", "my-java-sdk /1.1").method(methodName.toUpperCase(), String.class, f);

结果是以下异常:

 com.sun.jersey.api.client.ClientHandlerException: java.net.ProtocolException: Invalid HTTP method: FOOBAR

我已经尝试了各种方法来尝试解决这个问题,但没有成功。

  • http://java.net/jira/browse/JERSEY-639已经在config.getProperties()线上面实施。仍然收到错误
  • 当我切换到apache http客户端时,我从接收所有非GET和非PUT请求请求的服务器收到411错误。

长话短说,我想实现类似于via Java中提供的功能:

提前感谢您的反馈

java rest jersey httpurlconnection
2个回答
4
投票

使用Jersey 2.x Client,我们将设置该属性

true

Client client = ClientBuilder.newClient();
client.property(HttpUrlConnectorProvider.SET_METHOD_WORKAROUND, true);
String response = client.target(url).request().method("PATCH", entity, String.class);

3
投票

它不是一个bug,它是一个功能。 :)

不过实话说。 HttpUrlConnection不允许您使用自定义HTTP方法,因为:

//此限制将阻止人们使用此类

//使用java实验w / new HTTP方法。

所以你不能使用其他方法(在java 6中):“GET”,“POST”,“HEAD”,“OPTIONS”,“PUT”,“DELETE”,“TRACE”

Jersey提供了一种解决方法,它使用反射来省略此检查:

DefaultClientConfig config = new DefaultClientConfig();
config.getProperties().put(URLConnectionClientHandler.PROPERTY_HTTP_URL_CONNECTION
     _SET_METHOD_WORKAROUND, true);
Client c = Client.create(config);
WebResource r = c.resource("http://google.com");
String reponse = r.method("FOOBAR", String.class);
© www.soinside.com 2019 - 2024. All rights reserved.