Spring Cloud api 网关没有正确发送 POST 请求

问题描述 投票:0回答:1

我有两个申请

  • 一个。单体(使用 java servlet 开发)
  • b。 Spring Boot 微服务(开发中)

我正在尝试开发 spring cloud api 网关,它将位于这两个应用程序的前面,并将根据收到的请求提供流量。大多数情况下,这两个应用程序都支持 POST 方法,并且 api 网关中的路由适用于 b.spring boot 微服务,但是当我在单体上尝试相同的请求和 url 时,观察到 spring cloud api 网关发送 GET 请求(这是不允许的)并且失败了404 错误。有什么方法可以确定 api 网关尝试了哪些确切请求?或者 api 网关先尝试 GET 然后再 POST 吗?

我可以通过检查访问日志确认我在 api 网关上尝试的 POST 请求中收到 GET 请求

0:0:0:0:0:0:0:1 - - [14/Jul/2022:12:34:31 -0700] "**GET** /myservice/revers HTTP/1.1" 404 1685 "PostmanRuntime/7.29.0" "0/455" 

启用 TRACE 后来自 api 网关的日志

2022-07-15 01:04:30.426  INFO 16016 --- [ctor-http-nio-3] c.t.tes.gwapi.config.LoggingFilter   : Incoming request http://localhost:8080/servlet ,is routed uri:http://10.2.1.55:3068/myservice/revers with id: my-route-id
2022-07-15 01:04:31.665 DEBUG 16016 --- [ctor-http-nio-3] r.netty.http.client.HttpClientConnect    : [d95e4f2a-1, L:/10.01.57.01:59773 - R:/10.2.1.55:3068] Handler is being applied: {uri=http://10.2.1.55:3068/myservice/revers , method=POST}
2022-07-15 01:04:31.974 DEBUG 16016 --- [ctor-http-nio-3] r.n.http.client.HttpClientOperations     : [d95e4f2a-1, L:/10.01.57.01:59773 - R:/10.2.1.55:3068] Received response (auto-read:false) : [Date=Thu, 14 Jul 2022 19:34:31 GMT, Server=Apache, Last-Modified=Wed, 06 Jul 2022 09:15:29 GMT, Accept-Ranges=bytes, Content-Type=text/html, content-length=1685]
2022-07-15 01:04:31.983 DEBUG 16016 --- [ctor-http-nio-3] r.n.http.client.HttpClientOperations     : [d95e4f2a-1, L:/10.01.57.01:59773 - R:/10.2.1.55:3068] Received last HTTP packet
2022-07-15 01:04:31.987  INFO 16016 --- [ctor-http-nio-3] c.t.t.gwapi.config.SpringCloudConfig     : Response body <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
sample html 

这里是示例 api 配置


@Bean
    public RouteLocator myRouteSavingRequestBody(RouteLocatorBuilder builder) {
        return builder.routes()
                .route("my-route-id",
                        p -> p
                                .path("/servlet/**") //your own path filter
                                .filters(f -> f
                                        .modifyResponseBody(String.class, String.class,
                                                (webExchange, originalBody) -> {
                                                    if (originalBody != null) {
                                                        //log.info("Response body {}", originalBody);
                                                        return Mono.just(originalBody);
                                                    } else {
                                                        return Mono.empty();
                                                    }
                                                })
                                        .modifyRequestBody(String.class, String.class,
                                                (webExchange, originalBody) -> {
                                                    if (originalBody != null) {
                                                       // log.info("Request body {}", originalBody);
                                                        return Mono.just(originalBody);
                                                    } else {
                                                        return Mono.empty();
                                                    }
                                                })
                                        .setPath("/myservice/revers")

                                )
                               .uri("http://10.2.1.55:3068")
                )
                .build();
    }

java spring-boot servlets microservices spring-cloud-gateway
1个回答
0
投票

Nginx 重定向可能导致 reuqest 方法更改。我使用 RouteLocator 作为网关将 POST 请求重定向到 HTTPS url,但是我用 HTTP url 写了一个错误的 uri,所以 Nginx 重定向并发送 GET 请求而不是 POST 请求。

© www.soinside.com 2019 - 2024. All rights reserved.