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

响应 通过 Rest Api 在多个出站网关调用之间传递的响应消息

谢承
2023-03-14

我有一个通过Rest接收消息的入站网关。收到的所有消息都进入内部网关。下面是入站网关xml文件。

 <bean name="testConfig" class="test.TestApiConfiguration"/>
    <context:annotation-config/>

    <int-http:inbound-gateway request-channel="requestChannel" supported-methods="POST" path="/data" reply-channel="replyChannel"
                              request-payload-type="com.test.model.CallFlow" header-mapper="cc20InBoundHeaders" error-channel="errorChannel" reply-timeout="9000">
        <int-http:request-mapping produces="application/json" consumes="application/json"/>
    </int-http:inbound-gateway>

    <bean id="cc20InBoundHeaders" class="org.springframework.integration.http.support.DefaultHttpHeaderMapper">
        <property name="inboundHeaderNames" value="*"/>
    </bean>

    <bean id="cc20OutBoundHeaders" class="org.springframework.integration.http.support.DefaultHttpHeaderMapper">
        <property name="outboundHeaderNames" value="Content-Type, HTTP_REQUEST_HEADERS"/>
        <property name="userDefinedHeaderPrefix" value="" />
    </bean>

因此,入站网关消息正确地以Json形式到达,然后内部网关接受它们,并根据配置将消息传递到通道中。

@MessagingGateway(name="callFlowGateway", requestChannel = "callFlowRequestChannel")
public interface ICallFlow {

    /**
     * Process CallFlow Request
     * @param message SI Message covering APiCall payload and relevant headers for service
     */
    @Gateway
    void processCallFlowRequest(Message<CallFlow> message);

}

直到这里,它的工作如预期的那样。消息先流向过滤器,然后流向路由器。在路由器中,如果一个json属性的类型是“饮料”服务,那么将调用饮料通道,并调用相关的出站网关来请求REST上的外部APIendpoint。

但是在调用该外部API的每个其余endpoint之前,您需要有一个有效的会话ID令牌来访问其他endpoint。它在其有效负载中返回一个会话ID来调用其他endpoint。此外,它将application/x-wan-form-urlencoded作为内容类型的标头。我创建了一个转换器来创建对身份验证服务的请求。

@MessageEndpoint               
public class AuthenticateTransformer {

    @Transformer(inputChannel = "splitterChannel", outputChannel = "authenticateRequestChannel")
    public Message<?> transform(CallFlow callFlow) {

        Map<String, Object> messagePayload = new HashMap<String, Object>();
        messagePayload.put("user", "test");
        messagePayload.put("password", "test");
        return MessageBuilder.withPayload(messagePayload).setHeader("Content-Type", "application/x-www-form-urlencoded").build();
        }
}

因此,理想情况下,一个对入站网关的调用-Json被转换为一个内部对象。基于JSON中的一个属性值,我使用http出站网关调用不同的外部restendpoint。

因为获取会话id的身份验证调用不在接收到的Json中,所以我必须在流中创建一个订单。

> < li>

我需要调用http出站网关进行身份验证,以获取该会话id。我如何从入站网关调用这个出站,因为它应该在每次调用其他endpoint之前执行。

在我获得该会话id后,我希望其他endpoint优先于rest,在此阶段,我希望调用ICallFlow gateway,以便基于json中的值和步骤1中的会话id,我可以调用其他Restendpoint并获得响应。

所以,我无法将会话ID令牌从第一次调用传递到第二次调用?另外,我希望只有在第一次身份验证请求完成后才能调用ICallFlow,并将该会话传递到其他后续请求中。我读到标头enrich可以做到这一点,我可以将有效负载放入标头中,但不知何故它不起作用。此外,我不知道如何以正确的顺序创建上述流。

任何帮助都将不胜感激。

共有1个答案

司空温书
2023-03-14

你在一个单独的线程中包含了太多的信息,不知何故会造成混乱和误导。

我能给你的建议是ContentEnrichhttps://docs.spring.io/spring-integration/docs/5.0.1.RELEASE/reference/html/messaging-transformation-chapter.html#payload-enricher

因此,您将通过< code>request-channel子流调用auth服务,获取一个会话id,并能够将其填充到标头或< code>ICallFlow有效负载中(如果可能)。

@Transformer用例中使用消息生成器时应小心。之后不会合并请求标头,您将无法对

传送请求头的方式类似于在< code>transform()方法中接受< code>Message并在< code>MessageBuilder上调用< code>copyHeaders()。

 类似资料:
  • 我正在将分布式架构从Python移动到。网络核心。此体系结构具有将请求推送到服务总线(KAFKA)的网关API。请求由微服务处理。这些微服务在请求对象中设置的主题上响应网关(然后响应客户端)。主题名称是基于python Application(Flask/uwsgi)的process_id构建的。 但是用。NetCore Webapi应用程序,我无法找到从其过程中获取主题的方法(我开始在.NetC

  • 我们如何将消息(例如“File uploaded Successed”)传递到调用/上一个jsp页面(例如upload.jsp)。jsp页面正在获取会话的属性,并检查用户登录的部门。它以部门名称确认用户。当用户上传文件,servlet在表单操作中被调用时,servlet检查部门名称并在数据库中插入数据,并在同一个upload.jsp页面上向用户显示消息“文件上传成功”。当iam在请求分派器中传递页

  • 问题内容: 我的Go服务器正在处理我首先打电话给的请求,以便设置响应的状态代码。之后,我开始将字节写入响应主体。如果我在复制字节时浏览器取消了请求,则会收到错误消息: 我的代码检测到此错误,然后调用。这再次调用。 这似乎是一个问题,但我不确定。可以避免吗?写入响应正文时发生错误时,如何避免再次调用? 谢谢! 问题答案: 的呼叫开始通过网络将响应发送到客户端。回应一经进行,便无法退回。您唯一可以做的

  • 我已经用ruby编写了以下代码来ping一个网站并检查响应。如果响应为真,则网站响应良好,但如果为假,则表明网站没有响应。 此代码工作正常,但无法计算网站响应的响应时间。 所以我的问题是如何计算网站响应的响应时间??

  • 我有一个项目是由比我更有才华的人发起和策划的,我已经到了一个我不知道如何沟通的地步。 这是一个Java /JavaFX/SpringBoot项目,而不是Swing项目。我看到很多答案re: Swing。两个应用程序也在Gradle中设置,因此两个应用程序都有自己单独的命令,并且在CentOS 7中运行。两个应用程序都有自己的,单独的,。我相信最初的设计是为了,有目的地,从GUI中删除对数据的任何访

  • 我正在读一本书中关于C#中的响应-消息模式的章节,当我最近遇到一个使用web API的项目时,我注意到了一些相似之处,并想要一些明确的东西。 在书中,作者的代码将请求(在本例中是CustomerRequestService)包装在一个名为CustomerRequestService的类中,该类的工作是处理这些请求(请求只不过是具有与查找客户的服务相关的搜索词或属性的类,而不执行其他非常稀薄/贫乏的