RequestMethod HEAD返回响应主体

时间:2019-08-21 08:36:41

标签: spring-boot

我必须实现HEAD方法,如 Spring 3.0 HEAD Requests  我已经尝试通过在请求映射中添加HEAD以及不在请求映射中添加HEAD来进行尝试。这两种方式都支持HEAD方法。

但是内容长度不为零,我也得到了响应主体(图像)。

    private static final String GZIPSUFFIX = "-gzip";

    @RequestMapping(value = "/version/url.json", method = { RequestMethod.GET, RequestMethod.HEAD })
    public ResponseEntity<byte[]> testUrl(@RequestParam(value = "uri") String url,
            @RequestParam(value = "size", required = false) String size,
            @RequestParam(value = "type", required = false) String type, WebRequest webRequest,
            HttpServletResponse response) {
        long startTime = 0;
        if (LOG.isDebugEnabled()) {
            startTime = System.nanoTime();
        }

        MediaFile mediaFile = retrieve(url, size);

        byte[] mediaContent;
        ResponseEntity<byte[]> result;

        ControllerUtils.addResponseHeaders(response);
        final HttpHeaders headers = new HttpHeaders();
            headers.setContentType(getMediaType(url));
            mediaContent = mediaFile.getContent();
            result = new ResponseEntity<>(mediaContent, headers, HttpStatus.OK);
        }

        return result;
    }

预期:内容长度为0,没有响应正文

实际:内容长度不为零,且为响应正文

1 个答案:

答案 0 :(得分:0)

您已表示要同时处理HEADGET请求:

@RequestMapping(value = "/version/url.json", method = { RequestMethod.GET, RequestMethod.HEAD })

这意味着您还需要为HEADGET实现不同的行为。您可以通过注入NativeWebRequest而不是WebRequest来获得请求的方法。您可以从NativeWebRequest检索基础HttpServletRequest,然后通过getMethod()从那里获取请求的方法。当"HEAD".equals(getMethod())时,您应该返回没有正文的ResponseEntity

一个更简单的解决方案是仅显式处理GET请求:

@RequestMapping(value = "/version/url.json", method =  RequestMethod.GET)

然后,Spring MVC将通过获取HEAD方法返回的响应并忽略主体来隐式处理testUrl对您的请求。

相关问题