当前位置: 首页 > 知识库问答 >
问题:

支持通过Spring Cloud Gateway代理SOAP/XMLendpoint

陆宇航
2023-03-14

尝试在使用Spring cloud Gateway代理soap服务时记录请求和响应。下面是代码段...它引发IllegalStateException。

IllegalStateException:只允许一个连接接收订阅服务器。在reactor.netty.channel.fluxreceive.startreceive(fluxreceive.java:271)[reactor-nety.channel.fluxreceive.subscribe(fluxreceive.java:121)[reactor-nety.channel.fluxreceive.jar:0.8.4.release.jar:0.8.4.release.jar:0.8.4.release]

--- Spring Versions ---

SpringBoot                  : 2.1.2.RELEASE
spring-cloud-gateway        : 2.1.1.BUILD-SNAPSHOT
spring-boot-starter-webflux : 2.1.2.RELEASE
reactor-core                : 3.2.5.RELEASE

GatewaySampleApplication

public class  GatewaySampleApplication {
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes() 
.route(
r ->
r.path("/security/getToken")
.filters( f -> f.preserveHostHeader()
.filter(new PolicyHandlerReactive()))
.uri("http://targetendpoint.xyz.com")
)
.build();
}
}

PolicyHandlerReactive:

PolicyHandlerReactive implements GatewayFilter  {

@Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) 
    {
        ServerHttpRequest request = (ServerHttpRequest) exchange.getRequest();
                Flux<DataBuffer> xmlReqFlux = request.getBody();    
                Mono<List<DataBuffer>> monoDataList = xmlReqFlux.collectList();
                monoDataList.map(dataA -> logRequest2(dataA)).subscribe();
        return chain.filter(exchange);
        }
}
private List<DataBuffer> logRequest(List<DataBuffer> dataA) {           

    ListIterator<DataBuffer> dataAList = dataA.listIterator();

    while(dataAList.hasNext() ) {
        DataBuffer dataBuffer = dataAList.next();
        InputStream is = dataBuffer.asInputStream();
        System.out.println(convertStreamToString(is));
    }       
    return dataA;
}   

共有1个答案

彭鹭洋
2023-03-14

能够使用.ModifyRequestBody而不是筛选器解决此问题...更新了以下java DSL...

    .route(
                    r ->
                    r.path("external/v2/security/")
                    .filters( f -> f
                            .preserveHostHeader()
                            .modifyRequestBody(String.class, String.class, 
                            (exchange, s) -> {
                                Mono<String> dataA = Mono.just(s); 
                                dataA.subscribe(System.out::print); 
                                return dataA; 
                            })                              
                         )                                                                                               
                    .uri("http://targetendpoint.xyz.com")
                    )
 类似资料:
  • 问题内容: 在Ubuntu 12.04上从源代码构建Python 3.2.3时,zlib模块不可用。 我从python.org下载了官方的源代码发行版,并尝试使用以下命令来构建和安装它。 make命令输出包括以下内容。 运行并启动解释器后,无法导入模块。 我确认该软件包已安装在我的系统上。 我也发现了类似的问题,建议将标志添加到命令中。但是,这将返回一个错误,它是无法识别的选项,并且无效。 问题答

  • 问题内容: 如何通过python Web抓取框架Scrapy利用代理支持? 问题答案: Scrapy是否可以与HTTP代理一起使用? 是。(从Scrapy 0.8开始)通过HTTP代理下载器中间件提供对HTTP代理的支持。请参阅。 使用代理的最简单方法是设置环境变量。如何完成取决于你的外壳。 如果你想使用https代理并访问https web,要设置环境变量,请遵循以下步骤:

  • 问题内容: 是否有任何软件包可以在Go上支持 SOAP / WSDL ? 问题答案: 不。 SOAP很烂,但是我必须实现一个使用SOAP的已经定义好的协议的服务器,因此我使用进行监听并使用对其进行了解码/编码。几分钟后,我已经将Go的第一个信封送达了。

  • 在这里我没有得到任何回应,请让我知道我犯了什么错误。请通过查看SOAP输入和输出值让我知道如何调用哪些代码

  • 问题内容: 我对python机械化的代理支持有疑问。我正在制作一些Web客户端脚本,我想在我的脚本中插入代理支持功能。 例如,如果我有: 如何在我的机械化脚本中添加代理支持?每当我打开此网站时,我都希望它通过代理。 问题答案: 您使用mechanize.Request.set_proxy(host,type)(至少从0.1.11开始) 假设运行在localhost:8888的http代理 应该管用