【问题标题】:OPTIONS method with Java client returns 200/OK alwaysJava 客户端的 OPTIONS 方法总是返回 200/OK
【发布时间】:2018-01-14 05:55:50
【问题描述】:

我有一个 Jersey REST 服务,当我从命令行使用 curl 访问它时,会得到预期的结果:

$ curl -i -X OPTIONS http://localhost:7001/path/to/my/resource
HTTP/1.1 402 Payment Required
Date: Mon, 07 Aug 2017 01:03:24 GMT
...
$

据此,我了解到我的 REST 服务已正确实现。

但是当我尝试从 Java 客户端调用它时,我得到了 200/OK。

public class Main3 {
    public static void main(String[] args) throws Exception {
        URL url = new URL("http://localhost:7001/path/to/my/resource");
        HttpURLConnection conn = null;

        try {
            conn = (HttpURLConnection) url.openConnection();

            conn.setRequestMethod("OPTIONS");
            int response = conn.getResponseCode();
            System.out.println(response);
        } finally {
            if (conn != null) {
                conn.disconnect();
            }
        }
    }
}

我单步执行了服务器代码,请求到达服务器中的 Jersey 代码,但之后,它以某种方式返回 200/OK 而不调用我的资源。我在这里做错了什么?

通过调试服务器,我知道在org.glassfish.jersey.server.ServerRuntime#process方法中,选择的Endpoint是org.glassfish.jersey.server.wadl.processor.OptionsMethodProcessor.GenericOptionsInflector。这总是返回200/OK。为什么我的资源的方法没有选择 @OPTIONS 注释?

【问题讨论】:

    标签: java rest web-services jersey http-options-method


    【解决方案1】:

    原来问题在于客户端代码没有设置Acccept标头,所以得到了Accept:text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2的默认值。 curl 而是放置标题 Accept:*/*。 Jersey 将 curl 调用路由到我的资源,因为它接受任何响应,但我的资源没有我的 Java 客户端代码接受的 @Produces(..) 注释。

    解决方法是添加以下行:

    conn.setRequestProperty("Accept", "*/*");
    

    在客户端代码中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-04
      • 2016-07-28
      • 2012-12-22
      • 2013-11-15
      • 2015-01-04
      • 2019-03-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多