有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使用JAXRS标准客户端API处理来自Web服务的错误JSON内容类型?

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

我有一个相当于完全工作的应用程序,它使用TMDB而不是烂番茄

我使用JBoss RESTEasy和RESTEasy Jackson2提供程序提供的标准JAX-RS客户端(当然,我不能发布我的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

直接的问题是,Rotter Tomatos 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”

Thesequestions是类似的,但公认的答案似乎使用JBoss特定的API,我只想通过JAX-RS客户端API来实现


共 (1) 个答案

  1. # 1 楼答案

    答案是使用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);
    }
    

    过滤器本身只是替换内容类型标题:

    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);
        }
    }