6

我想使用烂番茄 API 来搜索电影。

我有一个使用 TMDB 而不是烂番茄的等效完全工作应用程序。

我使用 JBoss RESTEasy 提供的标准 JAX-RS 客户端和 RESTEasy Jackson2 提供程序(当然我不能发布我的 API 密钥):

public MovieSearchResults search(String query) {
    return client
        .target("http://api.rottentomatoes.com/api/public/v1.0/movies.json")
        .queryParam("apikey", API_KEY)
        .queryParam("q", query)
        .request(MediaType.APPLICATION_JSON)
        .get(MovieSearchResults.class);
}

MovieSearchResults 类只是一个 JAXB 注释类,用于绑定 JSON。

最直接的问题是烂番茄 API 正在为其所有 JSON 响应返回内容类型为“text/javascript”的响应。他们已经表现出不愿意改变他们的服务,即使这显然是返回 JSON 时设置的错误内容类型,所以现在就是这样。

我调用服务时遇到的异常是:

Exception in thread "main"
javax.ws.rs.client.ResponseProcessingException: 
javax.ws.rs.ProcessingException: 
Unable to find a MessageBodyReader of 
content-type text/javascript;charset=ISO-8859-1 and type class MovieSearchResults

所以问题是:是否有一种简单的方法来获取/配置标准 JAX-RS 客户端以将返回的“text/javascript”内容类型识别为“application/json”?

这些 问题是相似的,但接受的答案似乎使用 JBoss 特定的 API,我只想通过 JAX-RS 客户端 API 来做。

4

1 回答 1

8

答案是使用 JAX-RS ClientResponseFilter。

请求更改为注册过滤器:

public MovieSearchResults search(String query) {
    return client
        .register(JsonContentTypeResponseFilter.class)
        .target("http://api.rottentomatoes.com/api/public/v1.0/movies.json")
        .queryParam("apikey", API_KEY)
        .queryParam("q", query)
        .request(MediaType.APPLICATION_JSON)
        .get(MovieSearchResults.class);
}

过滤器本身只是替换了 content-type 标头:

public class JsonContentTypeResponseFilter implements ClientResponseFilter {

    @Override
    public void filter(ClientRequestContext requestContext, ClientResponseContext responseContext) throws IOException {
        List<String> contentType = new ArrayList<>(1);
        contentType.add(MediaType.APPLICATION_JSON);
        responseContext.getHeaders().put("Content-Type", contentType);
    }
}
于 2014-01-27T12:50:33.323 回答