OPTIONS方法与Java客户端返回200/OK总是

问题描述:

我有一个新泽西州的REST服务,当我访问使用curl命令行,给了我预期的结果:OPTIONS方法与Java客户端返回200/OK总是

$ 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(); 
      } 
     } 
    } 
} 

我通过服务器代码加强和请求到达服务器泽西代码,但在那之后,它在某种程度上返回200/OK不叫我的资源。我在这里做错了什么?

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

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

此修复程序是添加一行:

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

在客户端的代码。