右键单击api文件夹,添加一个REST API
打开 api 的 xml 文件,单击 Resource,在属性把 Post 设为 true,这个是设置可以接收 http 方法。
属性中介器对消息没有直接影响,而是对流经 Synapse 的消息上下文产生影响。 可以通过 Synapse XPath 变量或 get-property() 扩展函数检索消息上设置的属性。 一个属性可以有一个定义的有效范围。 如果属性没有定义的范围,则默认为 Synapse 消息上下文范围。 使用指定为 remove 的操作的属性元素,可以删除任何现有的消息上下文属性。
Property Action
set:如果选择此项,将在消息上下文中设置该属性。
remove:如果选择此项,该属性将从消息上下文中移除。
Value Type
Value:如果选择此项,静态值将被视为属性值,并且应在值参数中输入该值。
Expression:如果选择此项,则在调解期间将通过Value Expression来确定属性值。 此表达式应输入到 Expression 参数中。
Property Data Type
属性的数据类型。 属性中介将把属性作为选定类型的属性进行处理。
多层解析:json-eval($.a.b.c)
多层解析://a//b//c
<property expression="$trp:usercode" name="usercode" scope="default" type="STRING"/> <property expression="$trp:password" name="password" scope="default" type="STRING"/>
类中介器创建自定义指定类的实例并将其设置为中介器。 该类必须实现 org.apache.synapse.api.Mediator 接口。 如果指定了任何属性,则在初始化期间在类上调用一次相应的 setter 方法。
仅当没有已提供所需功能的内置介体时,才将类介体用于特定于用户的自定义开发。 维护自定义类会产生很高的开销。 因此避免使用它们,除非场景经常重复使用并且非常特定于用户。
类中设置的 get、set 的属性名必须和上面设置的 Property Name 一致。
此处返回的是 xml 格式,则在 PayloadFactory 的 get-property 设置的应该是 xml 格式。
PayloadFactory Mediator 转换或替换消息的内容。 中介器配置中的每个参数都可以是静态值,或者可以指定 XPath 或 JSON 表达式以通过针对现有 SOAP 消息评估提供的表达式来在运行时获取值。 可以配置请求或响应的格式并将其映射到提供的参数。
Media Type
此参数用于指定是否应以 JSON 或 XML 格式创建消息负载。
Payload Format
Inline:如果选中此选项,则可以通过在出现的文本字段中输入有效负载格式在 PayloadFactory 介体配置中进行定义。 要将内容添加到有效负载,请使用 $n 格式为要添加的每个值输入变量(从 1 开始并随着每个附加变量递增,即 $1、$2 等)。 然后,将按照与变量相同的顺序创建参数,以指定每个变量的实际值。
Register Reference:如果选择此项,则可以选择保存在注册表中的现有负载格式。 单击相关的 Governance Registry 或 Configuration Registry 以从资源树中选择有效负载格式。
返回JSON数据,Payload为:{"ESB":$1}
Class 中介器返回的必须是 json 才能使用此表达式
在Value中指定参数返回值的表达式。
返回全部值:$.
返回esb的temp的值:$.esb.temp
返回xml数据,Payload为:$1
此处的 get-property('resp') 的参数名必须和在 Class 在返回的 Property 一致!!!
XML
JSON
响应中介器停止对当前消息的处理并将消息作为响应发送回客户端。
第一次运行可能会发布不成功,重新Redeploy一下
WSO2输出
日志:
property_name: jsondata
xmldata: {"ESB":{"DATA":{"DATAINFOS":{"PUUID":11111,"SYNCODE":"ZWY","DATAINFO":{"DESC1":"ABC"}}}}}
result: {"result":"S","moveTotal":12}
[2021-07-09 10:28:24,629] INFO - LogMediator To: /ttt, MessageID: urn:uuid:4bbb1765-2743-4cc6-a86e-3ad670237d41, Direction: request, Payload: {"ESB":{"result":"S","moveTotal":12}}
package com; import org.apache.synapse.MessageContext; import org.apache.synapse.mediators.AbstractMediator; import org.json.JSONObject; import org.json.XML; public class TTTest extends AbstractMediator { private String property_name; public String getProperty_name() { return property_name; } public void setProperty_name(String property_name) { this.property_name = property_name; } public boolean mediate(MessageContext context) { // TODO Implement your mediation logic here String xmldata = (String) context.getProperty(property_name); System.out.println("property_name: " + property_name); System.out.println("xmldata: " + xmldata); //StringBuffer resultss = new StringBuffer("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); //resultss.append("<ESB></ESB>"); String sss = "<result>S</result><moveTotal>" + 12 + "</moveTotal>"; //JSONObject j = XML.toJSONObject(sss); System.out.println("result: " + sss); context.setProperty("response", sss); return true; } }
<?xml version="1.0" encoding="UTF-8"?> <api context="/ttt" name="ttt" xmlns="http://ws.apache.org/ns/synapse"> <resource methods="POST GET"> <inSequence> <property expression="json-eval($.)" name="jsondata" scope="default" type="STRING"/> <class name="com.TTTest"> <property name="property_name" value="jsondata"/> </class> <payloadFactory media-type="json"> <format>{"ESB":$1}</format> <args> <arg evaluator="xml" expression="get-property('response')"/> </args> </payloadFactory> <log level="full"/> <respond/> </inSequence> <outSequence/> <faultSequence/> </resource> </api>
package com; import org.apache.synapse.MessageContext; import org.apache.synapse.mediators.AbstractMediator; public class TTTest extends AbstractMediator { private String property_name; private String property2; public String getProperty_name() { return property_name; } public void setProperty_name(String property_name) { this.property_name = property_name; } public String getProperty2() { return property2; } public void setProperty2(String property2) { this.property2 = property2; } public boolean mediate(MessageContext context) { // TODO Implement your mediation logic here String p1 = (String)context.getProperty(property_name); String p2 = (String)context.getProperty(property2); System.out.println("p1: " + p1); System.out.println("p2: " + p2); String args = "{\n" + " \"esb\":{\n" + " \"args1\":\"aaaaaaaaaaa\",\n" + " \"args2\":{\n" + " \"bbb\":\"bbbbbbbbbbb\"\n" + " }\n" + " }\n" + "}"; context.setProperty("args", args); return true; } }
<?xml version="1.0" encoding="UTF-8"?> <api context="/test_first" name="testfirst" xmlns="http://ws.apache.org/ns/synapse"> <resource methods="POST GET"> <inSequence> <property expression="json-eval($.esb.args1)" name="test" scope="default" type="STRING"/> <property expression="json-eval($.esb.args2)" name="test2" scope="default" type="STRING"/> <class name="com.TTTest"> <property name="property_name" value="test"/> <property name="property2" value="test2"/> </class> <payloadFactory media-type="json"> <format>{"ESB": {
 "args1":$1,
 "args2":$2
 } 
 }</format> <args> <arg evaluator="json" expression="$.esb.args1"/> <arg evaluator="json" expression="$.esb.args2"/> </args> </payloadFactory> <respond/> </inSequence> <outSequence/> <faultSequence/> </resource> </api>
Call Mediator用于将消息从 ESB 发送到端点。可以以阻塞或非阻塞方式调用服务。
当以非阻塞模式调用服务时,底层工作线程无需等待响应即可返回。在阻塞模式下,底层工作线程被阻塞并在向端点发送请求后等待响应。阻塞模式下的调用中介器与 Callout 中介器非常相似。
在阻塞和非阻塞模式下,Call 中介器都以同步方式运行。因此,中介在服务调用后暂停,并在收到响应时从序列中的下一个中介恢复。调用中介器允许创建独立于底层架构的配置。
Call 中介器的非阻塞模式利用非阻塞传输来获得更好的性能。因此,建议尽量在非阻塞模式下使用。但是,有些场景需要使用阻塞模式。例如,当实现与 JMS 事务相关的场景时,以阻塞模式使用底层线程至关重要。
在阻塞模式下,Call mediator 使用/repository/conf/axis2/axis2blockingclient.xml 文件作为 Axis2 配置。有关可为呼叫介体配置的阻塞传输相关参数的更多信息,请参阅配置axis2blockingclient.xml。
Endpoint Type
None:如果不提供端点,请选择此选项。 Call 中介将使用其 wsa:to 地址发送消息。
Define Inline:如果选择此项,则应将消息发送到的端点可以包含在呼叫中介器配置中。 单击添加以添加所需的端点。
Pick From Registry:如果选择此项,则可以将消息发送到当前作为资源保存在注册表中的预定义端点。 单击相关的配置注册表或治理注册表以从资源树中选择所需的端点。
XPath:如果选择此项,则消息应发送到的端点将通过 XPath 表达式派生。 需要在选择此选项时出现的文本字段中输入相关的 XPath 表达式。(如果要提供表达式,则可以单击 NameSpaces 添加命名空间。 然后将出现 Namespace Editor 面板,可以在其中提供 XPath 表达式中使用的任意数量的名称空间前缀和 URL。)
Blocking
如果设置为 true,则可以在阻塞模式下使用呼叫调解器。
地址端点是通过指定 EPR(端点参考)和配置的其他属性定义的端点。
(简单的来说就是 Call Mediator 接收消息的端点)
属性说明
Basic
URI:目标端点的EPR。
Format:端点的消息格式。
Leave As-Is:如果选中此选项,则不会对传出消息进行任何转换。
SOAP 1.1:如果选择此项,消息将转换为 SOAP 1.1。
SOAP 1.2:如果选择此项,消息将转换为 SOAP 1.2。
Plain Old XML (POX):如果选择此选项,消息将转换为纯旧 XML 格式。
Representational State Transfer (REST) - 如果选择此项,消息将转换为 REST。
GET:如果选择此项,消息将转换为 HTTP Get 请求。
statistics enabled:这将启用端点的统计信息。
trace enabled:这将启用端点的跟踪。
Data Mapper 中介器是一种可以集成到中介序列中的数据映射解决方案。它将一种数据格式转换并转换为另一种数据格式,或更改消息中数据的结构。它提供了一个基于 WSO2 Developer Studio 的工具来创建图形映射配置,并生成 WSO2 Data Mapper 引擎执行此图形映射配置所需的文件。
WSO2 数据映射器是一个独立的组件,不依赖于任何其他 WSO2 产品。但是,其他产品可以使用 Data Mapper 来实现/提供数据映射功能。 Data Mapper Mediator 是中间组件,它提供了到 WSO2 ESB 的数据映射能力。
数据映射器介体从注册表中查找配置文件,并使用输入消息类型 (XML/JSON/CSV) 和输出消息类型 (XML/JSON/CSV) 配置数据映射引擎。然后它从 WSO2 ESB 消息流中获取请求消息,并使用配置的数据映射引擎执行转换并将输出消息添加到 ESB 消息流。
本例演示JSON转XML
输入JSON
{
** "esb":{
"args1":"aaaaaaaaaaa",
"args2":{
"bbb":"bbbbbbbbbbb"
}
}
}
输出XML
aaaaaaaaaaa
bbbbbbbbbbb
保存为文件**
右键单击,选择Load Input
Output选择xml
导入之前保存的文件
把箭头拉线接上,即可完成JSON转XML
最后记得把Configuration添加到项目
日志中介器用于记录中介消息。
Log Category:
以下日志级别对应于 ESB 服务级别日志。
TRACE - 这指定了比 DEBUG 更细粒度的信息事件。
DEBUG - 这指定了对调试应用程序最有用的细粒度信息事件。
INFO - 这指定了在粗粒度级别突出显示应用程序进度的信息性消息。
WARN - 这表示潜在的有害情况。
ERROR - 这指定了可能仍允许应用程序继续运行的错误事件。
FATAL - 这表示可能会导致应用程序中止的非常严重的错误事件。
Log Level:
Full:如果选择此选项,将记录在简单级别记录的所有标准标题以及消息的完整有效负载。 此日志级别会导致解析消息内容,从而导致性能开销。
Simple:如果选择此项,将记录标准头(即 To、From、WSAction、SOAPAction、Reply To 和 MessageID)。
Headers头:如果选中此选项,则会记录所有 SOAP 标头块。
Custom:如果选择此项,则只会记录添加到日志介体配置的属性。
Log Separator:
此参数用于指定要在日志中用于分隔属性的值。 , 逗号是默认值。