如何从 wso2 ESB 中的另一个服务调用服务(或一个服务的参数)

Posted

技术标签:

【中文标题】如何从 wso2 ESB 中的另一个服务调用服务(或一个服务的参数)【英文标题】:how to call a service (or parameter of one service) from another service in wso2 ESB 【发布时间】:2016-01-04 12:11:03 【问题描述】:

我正在使用 wso2 ESB 创建一个 json 格式的 rest API。我有一个安静的 json 网络服务,它给出了响应。我需要在另一个服务调用中使用此响应的参数之一。 我如何在 wso2 ESB 中进行这种服务链接。

例如:-

我有一个宁静的网址,如 abc.com/cusotmer。我得到了回复。假设“id”是响应的参数之一。 我想在另一个内部调用第一个服务 (abc.com/cusotmer) 的服务调用(例如 xyz.com/sheet)中使用此参数。

你们中的任何人都可以在这方面帮助我吗?

【问题讨论】:

【参考方案1】:

这是服务链。您可以参考 WSO2 库文章,该文章通过示例清楚地解释了这一点 http://wso2.com/library/articles/2011/01/wso2-esb-by-example-service-chaining/

【讨论】:

大部分示例都是基于肥皂的。我找不到与 JSON 对象相关的任何内容。你有什么指点 一个我无法弄清楚的小问题。假设我有一个看起来像这样的响应“param1”:false,“param2”:“id”:“12345”,“value”:“50”,你能告诉我是否要检索“value” “字段,我如何在 wso2 esb 中做到这一点?这个响应来自一个 url,比如“abc.com”。在这方面你能帮我吗【参考方案2】:

服务链是任何可用 ESB 中的一个重要特性。

您可以使用Call Mediator 将控件保持在序列中(比如您的序列)

您可以对第一个端点使用调用,对于第二个端点,我假设 id 在响应正文中可用,您可以使用 json-eval 或 xpath 来获取此值,具体取决于您可以使用的第二个服务使用的数据类型PayloadFactoryMediator 并在所需的身体部位设置 id

在下一行,您可以使用 Call Mediator 或 Send 再次拨打电话

粗略的代码会是这样的。

<payloadFactory media-type="json">
            <format>
                  "A": "6", "tests": [ "id": "xyz", "status": "new", "emp": [ "Id": "12345" ] ], "student": [ "Id": "65", "Name": "Ram" ] 
            </format>

        </payloadFactory>
<call>
        <endpoint>
           <http method="get" uri-template="http://192.168.1.10:8088/mockaxis2service"/>
        </endpoint>
     </call>
<!-- suppose id field comes as response in field name id2 -->
<payloadFactory media-type="json">
            <format>
               
                 "inp2second":"$1"       
               
            </format>
            <args>
                <arg expression="$.emp.id2"/>
            </args>
        </payloadFactory>
<call> or <send>

您现在可以使用 call 或 send mediator ,send mediator 将控件移至外序。

对于上面使用的 json 表达式 $.emp.id2 请参考 json support page 例如 还提供了一个服务链示例here

【讨论】:

@Rahul 第二个服务的响应正文(我从中选择“id”参数)和第一个服务的请求正文是 json 格式。其中“emp”字段的 id 是从第二个服务中检索的。你能告诉我怎么做吗? 第一个服务的示例请求: "A": "6", "tests": [ "id": "xyz", "status": "new", "emp": [ "Id": "12345", ] ], "student": [ "Id": "65", "Name": "Ram" ] 更新了答案@user2326831 我强烈建议您阅读上面给出的关于payloadfactory和json支持链接的文档,并考虑如何使用我提供的解决方案我不知道确切的结构,所以我假设第二次服务的主体,对于多个参数,您可以将 arg 添加为 $2、$3 等 谢谢。我明白了这个概念。一个我无法弄清楚的小问题。假设我有一个看起来像这样的响应“param1”:false,“param2”:“id”:“12345”,“value”:“50”,你能告诉我是否要检索“value” “字段,我如何在 wso2 esb 中做到这一点?上面的示例响应来自一个 url,比如“abc.com”。你能在这方面帮助我吗? 您可以在属性表达式中使用$.param2.value,或者如果您想在payloadfactory中使用它,您可以按照我上面的答案所示进行操作。如果 wso2 在内部将 json 转换为 xml,您可以使用 &lt;log level="full"/&gt; 进行检查,然后您也可以使用 xpath 表达式

以上是关于如何从 wso2 ESB 中的另一个服务调用服务(或一个服务的参数)的主要内容,如果未能解决你的问题,请参考以下文章

如何正确配置此WSO2计划任务以执行简单的REST服务调用?

如何在 WSO2 ESB 中访问注册表

WSO2 ESB聚类概念

如何从wso2 ESB中的Response消息中删除Content-Type

任何人都可以解释下面wso2 esb synapse.xml文件的语法和功能。消息中介发生了

如何使用 wso2 esb 执行 ldap 搜索?