WSO2 REST API:如何在 GET 请求中返回多行
您能否建议如何获得多行? 我的 API 源:
<inSequence xmlns="http://ws.apache.org/ns/synapse">
<property expression="json-eval($.vendorId)" name="vendorId" scope="default" type="STRING"/>
<dblookup>
<connection>
<pool>
<dsName>MyDS</dsName>
</pool>
</connection>
<statement>
<sql><![CDATA[select * from db_view v where v.vendorId = nvl(?, v.vendorId)]]></sql>
<parameter expression="$ctx:vendorId" type="VARCHAR"/>
<result column="vendorId" name="vendorId"/>
<result column="vendorName" name="vendorName"/>
</statement>
</dblookup>
<filter xpath="boolean($ctx:vendorId)">
<then>
<payloadFactory media-type="json">
<format>{"result": { "vendorId" : "$1","vendorName" : "$2"}}</format>
<args>
<arg evaluator="xml" expression="$ctx:vendorId" literal="false"/>
<arg evaluator="xml" expression="$ctx:vendorName" literal="false"/>
</args>
</payloadFactory>
</then>
<else>
<payloadFactory media-type="json">
<format>{"response" : { "code" : "01","message" : "fail"}}</format>
</payloadFactory>
</else>
</filter>
</inSequence>
我的数据库视图返回 5 行,但我只从 GET 请求中获取第一行:
{"result": { "vendorId" : "123", "vendorName" : "My Vendor N1" }}
此外,如果我传递参数vendorId = 321,则 api 应返回 0 行。目前,它始终返回视图中的第一行。为什么以及如何让它发挥作用? 预先感谢
CALLOUT 调解员:
<resource methods="GET" uri-template="/get/supplier/{filterQuery}">
<inSequence>
<property name="operation" value="view" scope="default" type="STRING"/>
<log level="full" separator="|">
<property name="operation" expression="get-property('operation')"/>
<property name="step" value="request"/>
</log>
<property name="filterQuery" expression="get-property('uri.var.filterQuery')" scope="default" type="STRING"/>
<log level="full" separator="|">
<property name="filterQuery" expression="$ctx:filterQuery"/>
</log>
<callout serviceURL="http://...:8280/services/serviceName" action="/vendors/$ctx:filterQuery">
<source type="envelope"/>
<target key="response"/>
</callout>
<log level="custom" separator="|">
<property name="MESSAGE" expression="$ctx:response"/>
</log>
<property name="res" expression="$ctx:response" scope="default" type="OM"/>
<property name="NO_ENTITY_BODY" scope="axis2" action="remove"/>
<property name="RESPONSE" value="true" scope="default" type="STRING"/>
<property name="messageType" value="application/json" scope="axis2" type="STRING"/>
<property name="contentType" value="application/json" scope="transport" type="STRING"/>
<payloadFactory media-type="json">
<format>{"vendorId": "$1","vendorName": "$2"}</format>
<args/>
</payloadFactory>
<log level="full" separator="|">
<property name="operation" expression="$ctx:operation"/>
<property name="step" value="response"/>
</log>
<respond/>
</inSequence>
<faultSequence>
<payloadFactory media-type="json">
<format>{"response" : {"code" : "01", "message" : "fail"}}</format>
<args/>
</payloadFactory>
</faultSequence>
</resource>
Could you please advice how to get more than one row?
My API source:
<inSequence xmlns="http://ws.apache.org/ns/synapse">
<property expression="json-eval($.vendorId)" name="vendorId" scope="default" type="STRING"/>
<dblookup>
<connection>
<pool>
<dsName>MyDS</dsName>
</pool>
</connection>
<statement>
<sql><![CDATA[select * from db_view v where v.vendorId = nvl(?, v.vendorId)]]></sql>
<parameter expression="$ctx:vendorId" type="VARCHAR"/>
<result column="vendorId" name="vendorId"/>
<result column="vendorName" name="vendorName"/>
</statement>
</dblookup>
<filter xpath="boolean($ctx:vendorId)">
<then>
<payloadFactory media-type="json">
<format>{"result": { "vendorId" : "$1","vendorName" : "$2"}}</format>
<args>
<arg evaluator="xml" expression="$ctx:vendorId" literal="false"/>
<arg evaluator="xml" expression="$ctx:vendorName" literal="false"/>
</args>
</payloadFactory>
</then>
<else>
<payloadFactory media-type="json">
<format>{"response" : { "code" : "01","message" : "fail"}}</format>
</payloadFactory>
</else>
</filter>
</inSequence>
My db view returns 5 rows, but I get only the first row from the GET request:
{"result": { "vendorId" : "123", "vendorName" : "My Vendor N1" }}
Also if I pass the parameter vendorId = 321, the api should return 0 rows. At the current moment it ALWAYS returns the first row from view. Why and how to make it work?
Thanks in advance
CALLOUT Mediator:
<resource methods="GET" uri-template="/get/supplier/{filterQuery}">
<inSequence>
<property name="operation" value="view" scope="default" type="STRING"/>
<log level="full" separator="|">
<property name="operation" expression="get-property('operation')"/>
<property name="step" value="request"/>
</log>
<property name="filterQuery" expression="get-property('uri.var.filterQuery')" scope="default" type="STRING"/>
<log level="full" separator="|">
<property name="filterQuery" expression="$ctx:filterQuery"/>
</log>
<callout serviceURL="http://...:8280/services/serviceName" action="/vendors/$ctx:filterQuery">
<source type="envelope"/>
<target key="response"/>
</callout>
<log level="custom" separator="|">
<property name="MESSAGE" expression="$ctx:response"/>
</log>
<property name="res" expression="$ctx:response" scope="default" type="OM"/>
<property name="NO_ENTITY_BODY" scope="axis2" action="remove"/>
<property name="RESPONSE" value="true" scope="default" type="STRING"/>
<property name="messageType" value="application/json" scope="axis2" type="STRING"/>
<property name="contentType" value="application/json" scope="transport" type="STRING"/>
<payloadFactory media-type="json">
<format>{"vendorId": "$1","vendorName": "$2"}</format>
<args/>
</payloadFactory>
<log level="full" separator="|">
<property name="operation" expression="$ctx:operation"/>
<property name="step" value="response"/>
</log>
<respond/>
</inSequence>
<faultSequence>
<payloadFactory media-type="json">
<format>{"response" : {"code" : "01", "message" : "fail"}}</format>
<args/>
</payloadFactory>
</faultSequence>
</resource>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您不能如上所述使用 dblookup madiator,但可以使用 数据源。
Get 方法数据服务的简要数据源示例;
您可以创建此 .dbs 文件并部署它。然后您可以使用特定参数调用此组件,例如 http://localhost:8290/services/RDBMSDataService/Employee/{EmployeeNumber} ,然后它将返回 json :
您可以从上下文中获取值,例如:
You can not use dblookup madiator as mentioned but you can use DataSources.
Brief datasource example for Get Method dataservice;
You can create this .dbs file and deploy it. Then you can call this component like http://localhost:8290/services/RDBMSDataService/Employee/{EmployeeNumber} with specific parametres then it will return json :
You can take the value from context like :
这是正常行为。您可以在 DBLookup Mediator 文档 中阅读:
This is normal behavior. As you can read in DBLookup Mediator documentation :