我尝试访问一个开放的数据Web服务,给我的交通信息.文档说,请求必须是GET,需要包含Accept:application / json和Content-Type:application / json.我不明白为什么他们需要Content-Type,但是可以:
我试图用Accept:Header检索数据,但是我总是得到一个415不支持的媒体类型.现在我正在尝试这样(但我不知道我是否真的正确设置两个头):
String entity = ClientBuilder.newClient().target(liveDataURI) .path(liveDataPath) .request(MediaType.APPLICATION_JSON) .accept(MediaType.APPLICATION_JSON) .get(String.class);
正如你所看到的,我使用的是泽西2.2,而且我仍然得到一个415不支持的媒体类型.
编辑
所以我得到它的工作,但我不明白为什么.不接受(MediaType.APPLICATION_JSON)和标题(“Content-type”,“application / json”)一样吗?
String responseEntity = ClientBuilder.newClient() .target(liveDataURI) .path(liveDataPath) .request(MediaType.APPLICATION_JSON) .header("Content-type","application/json") .get(String.class);
解决方法
Accept标头告诉服务器您的客户端在响应中需要什么. Content-Type标头告诉服务器客户端在请求中发送的内容.所以两者不一样.
如果服务器只接受application / json,则必须发送一个指定请求内容的请求:
Content-Type: application/json
这就是为什么你编辑的代码工作.
编辑
在你的第一个代码中你使用WebTarget.request(MediaType... acceptedResponseTypes)
.这个方法的参数
define the accepted response media types.
您正在使用Innvocation.Builder.accept(MediaType... mediaTypes)
对此方法调用的结果.但是,accept()不会添加新的标题,在第一个代码中不必要.
您从不指定请求的内容类型.由于服务器需要一个Content-Type标头,所以它响应415.