Jersey客户端在重定向时忘记接受标头

时间:2011-06-23 16:12:07

标签: redirect http-headers client jersey

我正在尝试使用Jersey作为RESTful应用程序的客户端。具体来说,我想POST一些JSON到服务器并获得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);

这会生成预期的HTTP请求,并Content-TypeAccept标头设置正确。现在,服务器决定创建所请求的资源,并使用HTTP/1.1 303 See Other响应重定向(据我所知,这是一个很好的做法)。好消息是泽西岛很高兴地拿起了Location标题并确实要求它被告知的资源。糟糕的是,它似乎忘记了我只想获得application/json资源并发送GET

Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2

服务器愉快地回答(完全合法的HTML)。我使用Wireshark验证了这一点。问题是泽西岛因为无法将其解析成JSONObject而爆炸。所以我的问题是

  • 泽西岛的这种行为是正确还是错误?
  • 是否有一些聪明的方式?

我知道我可以通过泽西岛的ClientResponse课程,看看我是否被重定向,但我认为应该有更好的方法来做这件事。

1 个答案:

答案 0 :(得分:2)

在泽西岛邮件列表上使用Pavel short conversation之后,似乎问题在于Java库中的HttpURLConnection类。通过使用Apache HTTP客户端库binding for Jersey可以很容易地解决这个问题,它可以很好地工作。