我正在尝试使用Jersey作为RESTful应用程序的客户端。具体来说,我想将一些JSON POST
发送到服务器,然后取回JSON,所以我的代码看起来是这样的:
final JSONObject config = new JSONObject();
clientConfig.put("fooParam", 60 * 5); /* 5 min timeout */
final JSONObject newClient = client.resource(/* URL */).
type(MediaType.APPLICATION_JSON).
accept(MediaType.APPLICATION_JSON).
post(JSONObject.class, config);
这生成具有适当设置的CCD_ 2和CCD_。现在,服务器决定创建请求的资源,使用HTTP/1.1 303 See Other
响应将重定向到那里(据我所知,这是一种很好的做法)。好消息是Jersey很高兴地获得了Location
头,并确实请求了它被告知的资源。坏消息是它似乎忘记了我只想获得application/json
资源,并发送了一个带有的GET
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
服务器愉快地回答(使用完全合法的HTML)。我用Wireshark验证了这一点。问题是Jersey对此大发雷霆,因为它无法将其解析为JSONObject
。所以我的问题是
- 泽西岛的这种行为是正确的还是错误的
- 有什么聪明的方法吗
我知道我可能会浏览Jersey的ClientResponse
课程,看看我自己是否被重定向了,但我认为应该有更好的方法来做到这一点。
在Jersey邮件列表上与Pavel进行了简短的交谈后,问题似乎出在Java库中的HttpURLConnection
类中。通过使用适用于Jersey的ApacheHTTPClient库绑定可以很容易地解决这一问题,该绑定工作得很好。