Java 如何从Spring处理的POST请求中获取原始二进制数据?
我需要编写一个能够处理CUrl发送的二进制数据的应用程序,例如:Java 如何从Spring处理的POST请求中获取原始二进制数据?,java,spring,curl,binary-data,Java,Spring,Curl,Binary Data,我需要编写一个能够处理CUrl发送的二进制数据的应用程序,例如: curl localhost:8080/data --data-binary @ZYSF15A46K1.txt 我创建了一个后处理方法,如下所示: @RequestMapping(method = RequestMethod.POST, value = "/data") public void acceptData(HttpEntity<byte[]> requestEntity) throws Except
curl localhost:8080/data --data-binary @ZYSF15A46K1.txt
我创建了一个后处理方法,如下所示:
@RequestMapping(method = RequestMethod.POST, value = "/data")
public void acceptData(HttpEntity<byte[]> requestEntity) throws Exception {
process(requestEntity.getBody());
}
@RequestMapping(method=RequestMethod.POST,value=“/data”)
public void acceptData(HttpEntity requestEntity)引发异常{
进程(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,如果禁用,可能是因为您的请求在某种程度上是错误的。请参阅。尝试使用
HttpServletDequest
作为控制器的输入参数,并从其InputStream
读取原始数据@geminieth也尝试过,出于某种原因,它总是返回空对象。您是否设置过字符编码?您可以检查内容长度
,以确保获得正确的请求。如果Content Length
有效,您可以从InputStream
中读取特定长度的内容。如果没有,请检查您的请求。@Gemineith谢谢!我仔细研究了HttpServletRequest,问题就解决了(见我的答案)。是的,我已经忘记了。输入流默认值只能读取一次。我的直觉是,funky HiddenHttpMethodFilter disable将关闭自动多部分过滤:“某种程度上是错误的”=检查请求中是否设置了内容类型
标题,并且它不是多部分/表单数据
或应用程序/x-www-form-url-encoded
我应该使用什么注释从邮递员到spring boot获取二进制数据?这取决于邮递员如何发送它。看这个。如果发送“原始”数据,则可以按原样使用上述声明。