[英]InvalidMimeTypeException: Invalid mime type "{Content-Type}": does not contain '/'
[英]Http response Content-Type is json. Error for "Invalid mime type"
我出於某種目的正在使用第 3 方 API。
這個 API 響應一個 URL,它基本上是一個 Amazon AWS url,它實際上包含我感興趣的數據。
我可以通過瀏覽器和 Postman 調用 AWS URL,后者以數據進行響應。
但是通過代碼,我收到以下錯誤:
InvalidMimeTypeException: Invalid mime type "json": does not contain '/'
我正在使用 Spring Boot 並制作 http calss,我正在使用RestTemplate
。
響應頭:
accept-ranges →bytes
content-length →1428
content-type →json
date →Thu, 25 Oct 2018 10:05:57 GMT
last-modified →Wed, 24 Oct 2018 18:44:44 GMT
server →AmazonS3
內容類型是“json”
我用過的代碼:
protected HttpHeaders httpHeader(String encodedApiKey) {
HttpHeaders headers = new HttpHeaders();
headers.set("Content-Type", " */*");
headers.add(HttpHeaders.ACCEPT, " */*");
headers.add(HttpHeaders.ACCEPT_CHARSET, StandardCharsets.UTF_8.name());
if (encodedApiKey != null && !encodedApiKey.isEmpty()) {
headers.add("Authorization", "Basic " + encodedApiKey);
}
return headers;
}
private HttpEntity<Tickets> getHttpEntity(String apiKey) {
if (apiKey== null || apiKey.isEmpty()) {
return new HttpEntity<>(httpHeader(null));
}
return new HttpEntity<>(httpHeader(encodeBase64(apiKey)));
}
ResponseEntity<Tickets> responseEntity = restTemplate.exchange(awsUri,
HttpMethod.GET,
httpEntity, new ParameterizedTypeReference<Tickets>() {});
}
這是一個例外:
org.springframework.http.InvalidMediaTypeException: Invalid mime type "json": does not contain '/'
at org.springframework.http.MediaType.parseMediaType(MediaType.java:534)
at org.springframework.http.HttpHeaders.getContentType(HttpHeaders.java:869)
at org.springframework.web.client.HttpMessageConverterExtractor.getContentType(HttpMessageConverterExtractor.java:124)
at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:88)
at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:959)
at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:942)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:689)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:662)
at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:339)
ClientHttpRequestInterceptor
,但這不會修改服務器的響應頭(或Content-Type 到application/json )有沒有人有任何想法?
我沒有親自檢查此案,但與您的案子極為相似。 由於在錯誤堆棧中存在HttpMessageConverterExtractor
因此我可以假設Spring不知道如何轉換響應。 因此,您可以自己添加一個propert MessageConverter
:
protected HttpHeaders httpHeader(String encodedApiKey) {
/***/
restTemplate.setMessageConverters(getMessageConverters());
ResponseEntity<Tickets> responseEntity = restTemplate.exchange(awsUri,
HttpMethod.GET,
httpEntity, new ParameterizedTypeReference<Tickets>() {});
}
private List<HttpMessageConverter<?>> getMessageConverters() {
List<HttpMessageConverter<?>> converters =
new ArrayList<HttpMessageConverter<?>>();
converters.add(new MappingJackson2HttpMessageConverter());
return converters;
}
UPD ResponseExctractor示例
private class TicketsResponseExtractor extends HttpMessageConverterExtractor<Tickets> {
public TicketsResponseExtractor (Class<Tickets> responseType,
List<HttpMessageConverter<?>> messageConverters) {
super(responseType, messageConverters);
}
@Override
public Tickets extractData(ClientHttpResponse response) throws IOException {
if (response.getStatusCode() == HttpStatus.OK) {
response.getHeaders().set("Content-Type", MediaType.APPLICATION_JSON_VALUE);
return super.extractData(response);
} else {
return null;
}
}
}
和RestTemplate
調用:
ResponseExtractor<Tickets> responseExtractor =
new TicketsResponseExtractor(Tickets.class, restTemplate.getMessageConverters());
Tickets result =
restTemplate.execute(awsUri, HttpMethod.GET, null, responseExtractor);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.