【问题标题】:jersey http client custom request methodjersey http客户端自定义请求方法
【发布时间】:2012-05-18 17:01:22
【问题描述】:

使用以下代码,使用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 错误。

长话短说,我想实现通过 Java 提供的类似功能:

提前感谢您的反馈

【问题讨论】:

  • 能否请您提供一些您收到此请求的服务器端代码。
  • 由于HTTP方法无效异常,服务器端从未收到请求
  • @sdolgy 你能发布完整的堆栈吗?这将(很可能)是泽西岛内部的一个错误。

标签: java rest jersey httpurlconnection


【解决方案1】:

使用 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);

【讨论】:

  • 感谢 Jersey 2.x 的最新答案!帮我解决了!
【解决方案2】:

这不是一个错误,它是一个功能。 :)

但是说真的。 HttpUrlConnection 不允许您使用自定义 HTTP 方法,因为:

// 这个限制会阻止人们使用这个类来

// 使用 java 试验新的 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);

【讨论】:

    猜你喜欢
    • 2010-09-12
    • 1970-01-01
    • 2017-05-17
    • 1970-01-01
    • 1970-01-01
    • 2014-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多