如何在进行休息模板调用期间处理生成中的多种响应媒体类型

问题描述 投票:0回答:1

我正在使用

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

java spring spring-boot
1个回答
0
投票

您可以使用 Accept 标头指定响应类型

示例: 获取 /api/urunler HTTP/1.1 主机:example.com 接受:application/json、application/xml

© www.soinside.com 2019 - 2024. All rights reserved.