如何从 Spring 处理的 POST 请求中获取原始二进制数据?
How to get raw binary data from a POST request processed by Spring?
我需要编写一个能够处理 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 文件,经过 Spring 它现在可以解压缩,这让我相信我得到的数据太多或太少。
如何解决这个问题并获取原始二进制数据?
我能够使用以下代码解决此问题:
@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默认做预处理,导致HttpServletRequest
到达RequestMapping
时为空。添加 FilterRegistrationBean
Bean 可以解决该问题。
就像在控制器方法的参数中声明一个 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。
我需要编写一个能够处理 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 文件,经过 Spring 它现在可以解压缩,这让我相信我得到的数据太多或太少。
如何解决这个问题并获取原始二进制数据?
我能够使用以下代码解决此问题:
@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默认做预处理,导致HttpServletRequest
到达RequestMapping
时为空。添加 FilterRegistrationBean
Bean 可以解决该问题。
就像在控制器方法的参数中声明一个 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。