Как обработать неправильный тип контента JSON из веб-сервисов с помощью стандартного клиентского API JAX-RS?

Я хочу использовать API Rotten Tomatoes для поиска фильмов.

у меня есть эквивалентное полностью рабочее приложение, которое использует TMDB, а не гнилые помидоры.

Я использую стандартный клиент JAX-RS, предоставленный JBoss RESTEasy с поставщиком 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.

непосредственная проблема заключается в том, что гнилой Tomatoes API возвращает ответ с типом контента "text / javascript" для всех своих ответов JSON. Они показали нежелание менять свои службы, хотя это явно неправильный тип контента для установки при возврате 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 для распознавания возвращаемого " текста / javascript" тип контента как "application / json"?

эти вопросы похожи, но принятые ответы, похоже, используют API JBoss, и я хотел бы сделать это только через API клиента JAX-RS.

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

сам фильтр просто заменяет заголовок 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);
    }
}