Я пытаюсь проверить и зарегистрировать данные формы, которые проходят через Spring Cloud Gateway. Я попробовал несколько методов и столкнулся с несколькими проблемами, и я не мог прочитать это должным образом. Я попытался:
@Component
public class GatewayRequestFilter {
@Bean
public GlobalFilter apply() {
return (exchange, chain) -> {
MediaType contentType = exchange.getRequest().getHeaders().getContentType();
ModifyRequestBodyGatewayFilterFactory.Config modifyRequestConfig = new ModifyRequestBodyGatewayFilterFactory.Config();
/// Method 1
if (contentType.includes(MediaType.MULTIPART_FORM_DATA)) {
modifyRequestConfig.setRewriteFunction(String.class, String.class, (exchange1, originalRequestBody) -> {
validateAndAuditLog(exchange1, originalRequestBody);
return Mono.just(originalRequestBody);
});
}
/// Method 2
if (contentType.includes(MediaType.MULTIPART_FORM_DATA)) {
return exchange.getMultipartData().flatMap(originalRequestBody -> {
validateAndAuditLog(exchange1, originalRequestBody);
return chain.filter(exchange);
});
}
/// Method 3:
/// https://github.com/spring-cloud/spring-cloud-gateway/issues/1307#issuecomment-553910834
return new ModifyRequestBodyGatewayFilterFactory().apply(modifyRequestConfig).filter(exchange, chain);
};
}
}
Для 1-го и 3-го метода, если я установил InClass как String.class, то я могу видеть данные в каком-то формате http. Проблема в том, что я не знаю, как разобрать его в hashMap или LinkedMultiValueMap для доступа к каждому значению с помощью ключа. Вот вывод, который я получаю:
----------------------------162653831591335516327921
Content-Disposition: form-data; name="simple-text"
text
----------------------------162653831591335516327921
Content-Disposition: form-data; name="simple-file"; filename="simple-file"
Content-Type: application/octet-stream
Simple file
----------------------------162653831591335516327921--
Если я изменяю inClass на Object.class, то возникает другая ошибка:
{
"timestamp": "2020-04-03T02:37:57.096+0000",
"path": "/tc/test/test",
"status": 500,
"error": "Internal Server Error",
"message": "Content type 'multipart/form-data;boundary=--------------------------537619313111072161580699' not supported for bodyType=java.lang.Object",
"requestId": "0592497a-1"
}
Для второго метода я могу получить данные в LinkedMultiValueMap, который это хорошо, потому что я могу читать все данные, используя значение ключа, и я также могу получить имя загруженного файла, но проблема в том, что он зависает на 10 секунд, прежде чем передать запрос в нисходящий поток.
Кто-нибудь знает, что мне делать, чтобы читать или изменять данные формы, которые проходят через Spring Cloud Gateway?