次のような、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を通過した後、解凍が可能になりました。これにより、取得するデータが多すぎるか少なすぎると思われます。
この問題を解決して生のバイナリデータを取得するにはどうすればよいですか?
コントローラメソッドのパラメータで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 を参照してください。
次のコードを使用してこれを解決することができました:
@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を追加すると、その問題が解決します。