web-dev-qa-db-ja.com

Springによって処理されたPOSTリクエストから生のバイナリデータを取得するにはどうすればよいですか?

次のような、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を通過した後、解凍が可能になりました。これにより、取得するデータが多すぎるか少なすぎると思われます。

この問題を解決して生のバイナリデータを取得するにはどうすればよいですか?

8
JonathanReez

コントローラメソッドのパラメータで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 を参照してください。

9
nimai

次のコードを使用してこれを解決することができました:

@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を追加すると、その問題が解決します。