使用Java客户端的OPTIONS方法总是返回200 / OK

时间:2017-08-07 01:24:39

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

我有一个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方法中,所选Endpointorg.glassfish.jersey.server.wadl.processor.OptionsMethodProcessor.GenericOptionsInflector。这总是返回200/OK。为什么我的资源的方法注释时未选择@OPTIONS

1 个答案:

答案 0 :(得分:0)

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

修复是添加行:

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

在客户端代码中。