[英]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”?
答案是使用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.