如何从Spring处理的POST请求中获取原始二进制数据?

2022-09-02 21:33:19

我需要编写一个能够处理CUrl发送的二进制数据的应用程序,例如:

curl localhost:8080/data --data-binary @ZYSF15A46K1.txt

我创建了一个POST处理方法,如下所示:

@RequestMapping(method = RequestMethod.POST, value = "/data")
    public void acceptData(HttpEntity<byte[]> requestEntity) throws Exception {
        process(requestEntity.getBody());
    }

但是,它似乎没有返回原始二进制数据。我尝试过发送一个GZip文件,在经历了春天之后,它现在是更长的可解压缩时间,这使我相信我要么获得了太多的数据,要么获得了太少的数据。

如何解决此问题并获取原始二进制数据?


答案 1

这就像在控制器方法的参数中声明 InputStream 一样简单:

@RequestMapping(method = RequestMethod.POST, value = "/data")
public void acceptData(InputStream dataStream) throws Exception {
    processText(dataStream);
}

你不需要禁用HiddenHttpMethodFilter,如果你这样做,可能是你的请求在某种程度上是错误的。请参阅 https://github.com/spring-projects/spring-boot/issues/5676


答案 2

我能够使用以下代码解决此问题:

@Bean
public FilterRegistrationBean registration(HiddenHttpMethodFilter filter) {
    FilterRegistrationBean registration = new FilterRegistrationBean(filter);
    registration.setEnabled(false);
    return registration;
}

@RequestMapping(method = RequestMethod.POST, value = "/data")
public void acceptData(HttpServletRequest requestEntity) throws Exception {
    byte[] processedText = IOUtils.toByteArray(requestEntity.getInputStream());
    processText(processedText);
}

默认情况下,Spring 会进行预处理,这会导致 在到达 .添加 Bean 可以解决此问题。HttpServletRequestRequestMappingFilterRegistrationBean


推荐