我正在使用RESTEasy,更具体地说,是他们框架的客户端。
我正在调用第三方Web服务,它会返回一些JSON代码。
但是,出于某些原因,他们的回复中的内容类型是“text / javascript”。
如何告诉RESTEasy它应该使用JSON提供程序(解组目的)来获取“text / javascript”内容类型?
这可能吗?
我的代码:
public interface XClient {
@GET
@Produces("application/json")
@Path("/api/x.json")
public Movie getMovieInformation(
@QueryParam("q") String title);
}
解决方案可能是什么样的:
public interface XClient {
@GET
@Produces("text/javascript")
// Tell somehow to use json provider despite the produces annotation
@Path("/api/x.json")
public Movie getMovieInformation(
@QueryParam("q") String title);
}
答案 0 :(得分:1)
我通过使用替换传入内容类型的拦截器解决了这个问题,如下所示:
this.requestFactory.getSuffixInterceptors().registerInterceptor(
new MediaTypeInterceptor());
static class MediaTypeInterceptor implements ClientExecutionInterceptor {
@Override
public ClientResponse execute(ClientExecutionContext ctx) throws Exception {
ClientResponse response = ctx.proceed();
String contentType = (String) response.getHeaders().getFirst("Content-Type");
if (contentType.startsWith("text/javascript")) {
response.getHeaders().putSingle("Content-Type", "application/json");
}
return response;
}
}
答案 1 :(得分:0)
我已经没时间了,所以这对我有用。我已经将服务器的响应标记为String,并且我手动处理了与Jackson的解组:
public interface XClient {
@GET
@Path("/api/x.json")
@Produces(MediaType.APPLICATION_JSON)
public String getMovieInformation(
@QueryParam("q") String title,
}
,在我的REST电话中:
MovieRESTAPIClient client = ProxyFactory.create(XClient.class,"http://api.xxx.com");
String json_string = client.getMovieInformation("taken");
ObjectMapper om = new ObjectMapper();
Movie movie = null;
try {
movie = om.readValue(json_string, Movie.class);
} catch (JsonParseException e) {
myLogger.severe(e.toString());
e.printStackTrace();
} catch (JsonMappingException e) {
myLogger.severe(e.toString());
e.printStackTrace();
} catch (IOException e) {
myLogger.severe(e.toString());
e.printStackTrace();
}
请告知这不是更好的解决方案。但这似乎有效。