我目前正在使用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,则必须检查响应代码。换句话说,是否有干净的方式来回复我得到的回应?
答案 0 :(得分: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();
}
答案 1 :(得分:2)
对我来说马丁的答案: JsonMappingException:找不到类sun.net.www.protocol.http.HttpURLConnection $ HttpInputStream 的序列化程序 改变
rb.entity(r.getEntityInputStream());
到
rb.entity(r.getEntity(new GenericType<String>(){}));
帮助。