4

我目前正在使用 Jersey 作为代理 REST api 来调用另一个 RESTful Web 服务。一些调用将在我的服务器中以最少的处理传入和传出。

有没有办法干净地做到这一点?我正在考虑使用 Jersey 客户端进行 REST 调用,然后将 ClientResponse 转换为 Response。这是可能的还是有更好的方法来做到这一点?

一些示例代码:

@GET
@Path("/groups/{ownerID}")
@Produces("application/xml")
public String getDomainGroups(@PathParam("ownerID") String ownerID) {
    WebResource r = client.resource(URL_BASE + "/" + URL_GET_GROUPS + "/" + ownerID);
    String resp = r.get(String.class);
    return resp;
}

如果响应始终成功,则此方法有效,但如果另一台服务器上有 404,我必须检查响应代码。换句话说,有没有干净的方法来返回我得到的响应?

4

2 回答 2

8

据我所知,没有方便的方法。你可以这样做:

public Response getDomainGroups(@PathParam("ownerID") String ownerID) {
    WebResource r = client.resource(URL_BASE + "/" + URL_GET_GROUPS + "/" + ownerID);
    ClientResponse resp = r.get(ClientResponse.class);
    return clientResponseToResponse(resp);
}

public static Response clientResponseToResponse(ClientResponse r) {
    // copy the status code
    ResponseBuilder rb = Response.status(r.getStatus());
    // copy all the headers
    for (Entry<String, List<String>> entry : r.getHeaders().entrySet()) {
        for (String value : entry.getValue()) {
            rb.header(entry.getKey(), value);
        }
    }
    // copy the entity
    rb.entity(r.getEntityInputStream());
    // return the response
    return rb.build();
}
于 2012-06-08T09:41:50.007 回答
2

对我来说,Martin throw 的回答: JsonMappingException: No serializer found for class sun.net.www.protocol.http.HttpURLConnection$HttpInputStream Change from

rb.entity(r.getEntityInputStream());

rb.entity(r.getEntity(new GenericType<String>(){}));

帮助。

于 2013-09-19T21:59:06.177 回答