首页 > 解决方案 > Spring获取接收到的正文的MediaType

问题描述

按照这个答案,我以这种方式在控制器中设置了我的方法:

@PostMapping(path = PathConstants.START_ACTION, consumes = {MediaType.APPLICATION_FORM_URLENCODED_VALUE, MediaType.APPLICATION_JSON_VALUE})
    public ResponseEntity<BaseResponse<ProcessInstance>> start(@PathVariable String processDefinitionId,
            @RequestBody(required = false) String params)

现在我需要根据我@RequestBody是一种 MediaType 还是另一种来表现不同,所以我需要知道我的params身体是否是 json o urlencoded。有没有办法做到这一点?

标签: springspring-bootspring-restcontrollermedia-type

解决方案


您可以简单地注入 Content-Type 标头。

    @PostMapping(path = "/{processDefinitionId}", consumes = {MediaType.APPLICATION_FORM_URLENCODED_VALUE, MediaType.APPLICATION_JSON_VALUE})
    public ResponseEntity<String> start(@PathVariable String processDefinitionId,
                                        @RequestBody(required = false) String params,
                                        @RequestHeader("Content-Type") String contentType) {
        if (contentType.startsWith(MediaType.APPLICATION_JSON_VALUE)) {
            System.out.println("json");
        } else {
            // ...
        }
        return ResponseEntity.ok(params);
    }

但我建议将此方法拆分为具有不同消耗值的两种方法:

    @PostMapping(path = "/v2/{processDefinitionId}", consumes = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<String> startV2Json(@PathVariable String processDefinitionId,
                                        @RequestBody(required = false) String params) {
        return ResponseEntity.ok(params);
    }

    @PostMapping(path = "/v2/{processDefinitionId}", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
    public ResponseEntity<String> startV2UrlEncoded(@PathVariable String processDefinitionId,
                                        @RequestBody(required = false) String params) {
        return ResponseEntity.ok(params);
    }

推荐阅读