我正在使用
rest template
调用 API。该 API 可以返回图像 byte[]
或错误对象 json
由于某些原因,我没有使用全局异常处理程序。我正在同一端点处理异常。
我调用的 API 根据
id
发送图像。如果未找到 HTTP(未找到特定 ID),它会在 json
中发送错误响应。
在成功的情况下,我能够获得图像。但如果 API 在
json
中返回错误响应,我会得到
org.springframework.http.converter.HttpMessageNotWritableException: No converter for [class org.json.simple.JSONObject] with preset Content-Type 'null']
下面是使用
rest template
的 API 调用代码
@GetMapping(value="api/image/{id}" , produces = { MediaType.IMAGE_JPEG_VALUE, MediaType.APPLICATION_JSON_VALUE })
public @ResponseBody ResponseEntity<Object> api_image_customer(@PathVariable(name = "id")String id){
String accessToken = getCrmAccessToken();
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", MediaType.APPLICATION_JSON_VALUE);
headers.add("Authorization", "Bearer "+accessToken);
ResponseEntity<byte[]> response = null;
HttpEntity formEntity = new HttpEntity(null, headers);
try {
response = restTemplate.exchange("http://172.18.5.19:8082/api/image/"+id, HttpMethod.GET,
formEntity, byte[].class);
if(response!=null && response.getStatusCode().is2xxSuccessful()) {
byte[] imageBytes = response.getBody();
return new ResponseEntity<>(imageBytes, HttpStatus.OK);
}
else if(response!=null && !response.getStatusCode().is2xxSuccessful()){
return new ResponseEntity<>(response, HttpStatus.INTERNAL_SERVER_ERROR);
}
else
{
return new ResponseEntity<>("ERROR", HttpStatus.INTERNAL_SERVER_ERROR);
}
}
catch(HttpClientErrorException ex) {
String msg = ex.getResponseBodyAsString();
System.out.println(msg+" !!!!"); // this is getting printed as json string.
JSONParser parser =new JSONParser();
JSONObject obj = null;
try {
obj = (JSONObject)parser.parse(msg);
}catch(Exception ex_) {
ex_.printStackTrace();
return new ResponseEntity<>("error converting json", HttpStatus.INTERNAL_SERVER_ERROR);
}
return new ResponseEntity<>(obj, HttpStatus.INTERNAL_SERVER_ERROR);
}
}
我希望,
MediaType
的produces
属性内的多个@GetMapping
条目能够处理两种类型的响应,即图像和json
。但这并没有发生。
有没有一种方法可以管理这两种类型的响应,例如动态更改响应的
content-type
。
您可以使用 Accept 标头指定响应类型
示例: 获取 /api/urunler HTTP/1.1 主机:example.com 接受:application/json、application/xml