Как читать / изменять данные формы, которые проходят через Spring Cloud Gateway? - PullRequest
0 голосов
/ 03 апреля 2020

Я пытаюсь проверить и зарегистрировать данные формы, которые проходят через 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?

...