Jersey客户端API WebResource accept()没有正确设置MIME头?

时间:2011-08-08 15:06:09

标签: java jersey

public static WebResource createWebResource()
{
    final ClientConfig  cc = new DefaultClientConfig();
    final Client        c = Client.create(cc);
    final WebResource   wr = c.resource("http://localhost:19801/wtg_inventory_war/wtg/rest")
                                  .path(inv);
    return wr;
}

public void tester()
{
final WebResource  wr = JaxrsClientUtil.createWebResource()
                                 .path("wtg-service");

    wr.accept(MediaType.APPLICATION_XML);

String   response = wr.path("get-services")
                          .type(MediaType.APPLICATION_XML)
                          .get(String.class);
    System.out.println(response);
}

服务器端:

@Path("get-services")
@GET
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public Response handleFindInventoryServices(
@Context WtgSpringContainer     ioc  // Spring config for service operations
)
{
    System.out.println("Got a service listing request...");
    LOGGER.info("Got a service listing request");

    Get the app specific data formatted in JAXB XML or JSON...

    .
    .
    .


    return Response.ok(msg).build();
}

无论客户端为可接受的媒体类型设置什么,JSON都会回来?使用curl和-HAccept:application / json或application / xml工作正常。我想在不更改服务器端的情况下测试我的服务器。

关于为什么我不能强制服务器将XML作为我的首选MIME类型的任何指针?

2 个答案:

答案 0 :(得分:3)

大卫,我明白了。你做了同样的事情......

WebResource.accept(..)是一个静态方法,实际上正在向我们返回一个我们都忽略的WebResource.Builder实例,并设置了正确的accept param。

我从以下位置更改了代码:

WebResource res = c.resource("http://localhost:5984/");
res.accept(MediaType.APPLICATION_JSON_TYPE);
System.out.println(res.get(String.class));

到:

WebResource res = c.resource("http://localhost:5984/");
Builder builder = res.accept(MediaType.APPLICATION_JSON_TYPE);
System.out.println(builder.get(String.class));

一切都开始工作,正确的'Accept'标题被发送到服务器。

希望有所帮助。

答案 1 :(得分:0)

我确实遇到了和你们一样的问题。

使用accept header属性可以正常工作。

我想到的另一种有趣的方法是使用响应构建器设置内容类型如下:

     return Response.status(Status.OK).entity(dto).type(request.getContentType()).build();

如果您这样做,则可以同时使用接受内容类型属性。