簡體   English   中英

如何使用JAX-RS標准客戶端API從Web服務處理錯誤的JSON內容類型?

[英]How to handle the wrong JSON content type from web-services using the JAX-RS standard client API?

我想使用爛番茄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類只是一個用於綁定JSON的JAXB注釋類。

直接的問題是Rotten Tomatoes 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來實現。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM