首页 > 解决方案 > RequestMethod HEAD 返回响应正文

问题描述

我必须实现 HEAD 方法,如 Spring 3.0 HEAD Requests中所述 。我尝试通过在请求映射中添加 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 且无响应正文

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

标签: spring-boot

解决方案


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

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

这意味着您还需要为HEADvs实现不同的行为GET。您可以通过注入NativeWebRequest而不是WebRequest. 您可以从中NativeWebRequest检索底层HttpServletRequest,并从那里通过 检索请求的方法getMethod()。当"HEAD".equals(getMethod())你应该返回ResponseEntity没有正文的时候。

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

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

然后,Spring MVC 将HEAD通过获取从您的testUrl方法返回的响应并忽略正文来隐式地为您处理请求。


推荐阅读