代码之家  ›  专栏  ›  技术社区  ›  Josh

spring请求返回json或xml响应

  •  0
  • Josh  · 技术社区  · 6 年前

    我有一个spring请求映射,我希望在默认情况下返回xml,如果在请求头中指定,则返回json。下面是一些代码:

    请求映射

    @RequestMapping(value = "/batch/{progName}", method = RequestMethod.GET, produces = "application/xml)
        public ResponseEntity<JobResults> processTestObject(@PathVariable("progName") String progName,
                                                            @RequestHeader("Content-Type") String contentType) throws Exception {
            HttpHeaders responseHeaders = MccControllerUtils.createCacheDisabledHeaders();
            if(contentType.equals("application/json")) {
                responseHeaders.setContentType(MediaType.APPLICATION_JSON);
            }
            LOGGER.info("Running batch program " + progName);
            JobResults response = batchService.processProgName(progName);
            return new ResponseEntity<JobResults>(response, responseHeaders, HttpStatus.OK);
        }
    
    • 使用没有邮件头的postman,当我到达这个端点时,会收到 400 Bad Request 状态代码。
    • 在postman headers字段中,如果指定 Content-Type 作为 application/xml 我得到了正确的xml响应。
    • 如果我指定 内容类型 作为 application/json 我有个错误 背面: Unexpected '<'

    我想要的是:

    默认情况下从端点返回xml,如果在请求中指定,则返回json

    编辑

    现在请求返回 400错误请求 当没有 Accept 内容类型 在邮递员内部发送。为了检索所需的响应,我必须指定 接受 内容类型 应用程序/XML

     @RequestMapping(value = "/batch/{progName}", method = RequestMethod.GET)
        public ResponseEntity<JobResults> processTestObject(@PathVariable("progName") String progName,
                                                            @RequestHeader("Content-Type") MediaType contentType) throws Exception {
            HttpHeaders responseHeaders = MccControllerUtils.createCacheDisabledHeaders();
            responseHeaders.setContentType(MediaType.APPLICATION_XML);
            if(!contentType.toString().equals("*/*")) {
                responseHeaders.setContentType(contentType);
            }
            LOGGER.info("Running batch program " + progName);
            JobResults response = batchService.processProgName(progName);
            return new ResponseEntity<JobResults>(response, responseHeaders, HttpStatus.OK);
        }
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   Roald Bankras    6 年前

    你的榜样仍然是 Content-Type 从请求中 Accept .其次,确保jobresults对象可由json封送处理程序和xml封送处理程序序列化。第三,如果您希望特定的行为是json被请求,您应该检查特定的媒体类型,而不是像 "*/*" 是的。

    控制器:

    @RequestMapping(value = "/batch/{progName}", method = RequestMethod.GET)
    public ResponseEntity<JobResults> processTestObject(@PathVariable("progName") String progName,
                                                        @RequestHeader("Accept") MediaType accept) throws Exception {
        HttpHeaders responseHeaders = new HttpHeaders();
        responseHeaders.setContentType(MediaType.APPLICATION_XML);
        if(!accept.toString().equals("*/*")) {
            responseHeaders.setContentType(accept);
        }
        JobResults response = new JobResults("23423", "result");
        return new ResponseEntity<JobResults>(response, responseHeaders, HttpStatus.OK);
    }
    

    一些响应对象,但已注释。

    @XmlRootElement
    public class JobResults {
        String id;
        String name;
    
        public JobResults(String id, String name) {
            this.id = id;
            this.name = name;
        }
    
        ....
    }
    

    上面的代码给了我 application/json 当要求通过时 接受 头球。