WSO2 EI - 使用 REST 进行 DSS 查询的输入参数
WSO2 EI - Input parameter on DSS Query with REST
我尝试按照本教程创建具有 JSON 输出的 DSS:
https://docs.wso2.com/display/EI620/Using+JSON+with+Data+Services
它适用于简单的查询,我可以毫无问题地格式化输出。
现在我正在尝试添加一个输入参数以按 ID 过滤记录,但它对我不起作用。
如教程中所述,我的 REST 是:
获取 http://{server_host}/services/Promemoria_PROMEMORIA_Tools/getCount/2
响应是:
Error processing GET request for : /services/Promemoria_PROMEMORIA_Tools/getCount/2</p><p>DS Code: INCOMPATIBLE_PARAMETERS_ERROR
Nested Exception:-
javax.xml.stream.XMLStreamException: DS Fault Message: Error in 'CallQuery.extractParams', cannot find parameter with type:query-param name:idp
DS Code: INCOMPATIBLE_PARAMETERS_ERROR
Source Data Service:-
Name: Promemoria_PROMEMORIA_Tools
Location: /Promemoria_PROMEMORIA_Tools.dbs
Description: Tool per permettere ad Amenta di inserire le pratiche fatte a mano.
Default Namespace: http://ws.wso2.org/dataservice
Current Request Name: _getgetcount_idp
Current Params: {}
我也试过:
获取 http://{server_host}/services/Promemoria_PROMEMORIA_Tools/getCount?idp=2
但这是错误的,因为无法识别该操作。
我在查询定义中将属性 defaultValue="3" 放在 idp 上,它开始工作...但它忽略了 REST 中的值。
怎么了?
这是我的 DSS 代码
<data name="Promemoria_PROMEMORIA_Tools" transports="http https local">
<description>Tool per permettere di inserire le pratiche fatte a mano.</description>
<config enableOData="false" id="OracleServizio_Promemoria2">
<property name="carbon_datasource_name">OracleServizio_Promemoria2</property>
</config>
<query id="getByCF" useConfig="OracleServizio_Promemoria2">
<sql>SELECT ID_ABILITAZIONE, ID_SERVIZIO, DESCR_SERVIZIO, CF_UTENTE, ID_CANALE_NOTIFICA, CANALE_NOTIFICA, ID_CONTATTO, CONTATTO, CANALE_ACQ, DATA_ACQ, CF_ACQ, PROTOCOLLO, DATA_PROT, PROV_UFF FROM SERVIZIO_PROMEMORIA.SE_MI_SCORDO_ABIL_SPORTELLO a where a.CF_UTENTE = :cf union all SELECT ID_ABILITAZIONE, ID_SERVIZIO, DESCR_SERVIZIO, CF_UTENTE, ID_CANALE_NOTIFICA, CANALE_NOTIFICA, ID_CONTATTO, CONTATTO, CANALE_ACQ, DATA_ACQ, CF_ACQ, PROTOCOLLO, DATA_PROT, PROV_UFF FROM SERVIZIO_PROMEMORIA.SE_MI_SCORDO_ABIL b where b.CF_UTENTE = :cf and b.CF_ACQ <> 'BATCH'</sql>
<result escapeNonPrintableChar="true" outputType="json">{
 "list": {
 "item": [{
 "id": "$ID_ABILITAZIONE",
 "service": {
 "id": "$ID_SERVIZIO",
 "info": "$DESCR_SERVIZIO"
 },
 "cfUser": "$CF_UTENTE",
 "channel": {
 "id": "$ID_CANALE_NOTIFICA",
 "info": "$CANALE_NOTIFICA"
 },
 "address": {
 "id": "$ID_CONTATTO",
 "info": "$CONTATTO"
 }
 }]
 }
}</result>
<param name="cf" sqlType="STRING"/>
</query>
<query id="getCount" useConfig="OracleServizio_Promemoria2">
<sql>SELECT ID_SERVIZIO, DESCR_SERVIZIO, ID_CANALE_NOTIFICA, CANALE_NOTIFICA, count(*) as recno FROM SERVIZIO_PROMEMORIA.SE_MI_SCORDO_ABIL_SPORTELLO a where a.ID_SERVIZIO=:idp group by ID_SERVIZIO, DESCR_SERVIZIO, ID_CANALE_NOTIFICA, CANALE_NOTIFICA</sql>
<param name="idp" paramType="SCALAR" sqlType="INTEGER"/>
<result escapeNonPrintableChar="true" outputType="json">{
 "list": {
 "item": [{
 "items": "$recno",
 "service": {
 "id": "$ID_SERVIZIO",
 "info": "$DESCR_SERVIZIO"
 },
 "channel": {
 "id": "$ID_CANALE_NOTIFICA",
 "info": "$CANALE_NOTIFICA"
 }
 }]
 }
}</result>
</query>
<resource method="GET" path="getByCF/{cf}">
<call-query href="getByCF">
<with-param name="cf" query-param="cf"/>
</call-query>
</resource>
<resource method="GET" path="getCount/{idp}">
<call-query href="getCount">
<with-param name="idp" query-param="idp"/>
</call-query>
</resource>
</data>
罗伯托
您能否通过从 DSS 代码中的资源中删除 /{idp} 来尝试相同的方法。
<resource method="GET" path="getCount">
<call-query href="getCount">
<with-param name="idp" query-param="idp"/>
</call-query>
我解决了这个问题,但我不太确定如何:)
我试着从头开始解释。
我通过构建 SOAP 服务的 WSO2 控制台创建向导创建了服务。
然后我使用在线 xml 编辑器编辑服务并将其转换为 REST。
它在 select 中工作正常并且输出正确但我无法使用输入参数(如上所述)。
在测试期间,我将 "getCount" 操作更改为 POST,但没有结果,但是当我将其放回 GET 时,它开始神奇地工作。
其他操作仍然无效。
我认为 WSO2 的某处存储了一个错误的配置,可能是向导创建的。
我完全删除了该服务并从一个空的 .dbs 文件重新启动,手动编写。
我用 "upload" 将它加载到 WSO2 中,它工作正常。
我用在线 xml 编辑器编辑了它,它仍然运行良好。
就这些了。
我尝试按照本教程创建具有 JSON 输出的 DSS: https://docs.wso2.com/display/EI620/Using+JSON+with+Data+Services
它适用于简单的查询,我可以毫无问题地格式化输出。
现在我正在尝试添加一个输入参数以按 ID 过滤记录,但它对我不起作用。 如教程中所述,我的 REST 是: 获取 http://{server_host}/services/Promemoria_PROMEMORIA_Tools/getCount/2
响应是:
Error processing GET request for : /services/Promemoria_PROMEMORIA_Tools/getCount/2</p><p>DS Code: INCOMPATIBLE_PARAMETERS_ERROR
Nested Exception:-
javax.xml.stream.XMLStreamException: DS Fault Message: Error in 'CallQuery.extractParams', cannot find parameter with type:query-param name:idp
DS Code: INCOMPATIBLE_PARAMETERS_ERROR
Source Data Service:-
Name: Promemoria_PROMEMORIA_Tools
Location: /Promemoria_PROMEMORIA_Tools.dbs
Description: Tool per permettere ad Amenta di inserire le pratiche fatte a mano.
Default Namespace: http://ws.wso2.org/dataservice
Current Request Name: _getgetcount_idp
Current Params: {}
我也试过: 获取 http://{server_host}/services/Promemoria_PROMEMORIA_Tools/getCount?idp=2 但这是错误的,因为无法识别该操作。
我在查询定义中将属性 defaultValue="3" 放在 idp 上,它开始工作...但它忽略了 REST 中的值。
怎么了? 这是我的 DSS 代码
<data name="Promemoria_PROMEMORIA_Tools" transports="http https local">
<description>Tool per permettere di inserire le pratiche fatte a mano.</description>
<config enableOData="false" id="OracleServizio_Promemoria2">
<property name="carbon_datasource_name">OracleServizio_Promemoria2</property>
</config>
<query id="getByCF" useConfig="OracleServizio_Promemoria2">
<sql>SELECT ID_ABILITAZIONE, ID_SERVIZIO, DESCR_SERVIZIO, CF_UTENTE, ID_CANALE_NOTIFICA, CANALE_NOTIFICA, ID_CONTATTO, CONTATTO, CANALE_ACQ, DATA_ACQ, CF_ACQ, PROTOCOLLO, DATA_PROT, PROV_UFF FROM SERVIZIO_PROMEMORIA.SE_MI_SCORDO_ABIL_SPORTELLO a where a.CF_UTENTE = :cf union all SELECT ID_ABILITAZIONE, ID_SERVIZIO, DESCR_SERVIZIO, CF_UTENTE, ID_CANALE_NOTIFICA, CANALE_NOTIFICA, ID_CONTATTO, CONTATTO, CANALE_ACQ, DATA_ACQ, CF_ACQ, PROTOCOLLO, DATA_PROT, PROV_UFF FROM SERVIZIO_PROMEMORIA.SE_MI_SCORDO_ABIL b where b.CF_UTENTE = :cf and b.CF_ACQ <> 'BATCH'</sql>
<result escapeNonPrintableChar="true" outputType="json">{
 "list": {
 "item": [{
 "id": "$ID_ABILITAZIONE",
 "service": {
 "id": "$ID_SERVIZIO",
 "info": "$DESCR_SERVIZIO"
 },
 "cfUser": "$CF_UTENTE",
 "channel": {
 "id": "$ID_CANALE_NOTIFICA",
 "info": "$CANALE_NOTIFICA"
 },
 "address": {
 "id": "$ID_CONTATTO",
 "info": "$CONTATTO"
 }
 }]
 }
}</result>
<param name="cf" sqlType="STRING"/>
</query>
<query id="getCount" useConfig="OracleServizio_Promemoria2">
<sql>SELECT ID_SERVIZIO, DESCR_SERVIZIO, ID_CANALE_NOTIFICA, CANALE_NOTIFICA, count(*) as recno FROM SERVIZIO_PROMEMORIA.SE_MI_SCORDO_ABIL_SPORTELLO a where a.ID_SERVIZIO=:idp group by ID_SERVIZIO, DESCR_SERVIZIO, ID_CANALE_NOTIFICA, CANALE_NOTIFICA</sql>
<param name="idp" paramType="SCALAR" sqlType="INTEGER"/>
<result escapeNonPrintableChar="true" outputType="json">{
 "list": {
 "item": [{
 "items": "$recno",
 "service": {
 "id": "$ID_SERVIZIO",
 "info": "$DESCR_SERVIZIO"
 },
 "channel": {
 "id": "$ID_CANALE_NOTIFICA",
 "info": "$CANALE_NOTIFICA"
 }
 }]
 }
}</result>
</query>
<resource method="GET" path="getByCF/{cf}">
<call-query href="getByCF">
<with-param name="cf" query-param="cf"/>
</call-query>
</resource>
<resource method="GET" path="getCount/{idp}">
<call-query href="getCount">
<with-param name="idp" query-param="idp"/>
</call-query>
</resource>
</data>
罗伯托
您能否通过从 DSS 代码中的资源中删除 /{idp} 来尝试相同的方法。
<resource method="GET" path="getCount">
<call-query href="getCount">
<with-param name="idp" query-param="idp"/>
</call-query>
我解决了这个问题,但我不太确定如何:) 我试着从头开始解释。 我通过构建 SOAP 服务的 WSO2 控制台创建向导创建了服务。 然后我使用在线 xml 编辑器编辑服务并将其转换为 REST。 它在 select 中工作正常并且输出正确但我无法使用输入参数(如上所述)。
在测试期间,我将 "getCount" 操作更改为 POST,但没有结果,但是当我将其放回 GET 时,它开始神奇地工作。 其他操作仍然无效。
我认为 WSO2 的某处存储了一个错误的配置,可能是向导创建的。 我完全删除了该服务并从一个空的 .dbs 文件重新启动,手动编写。 我用 "upload" 将它加载到 WSO2 中,它工作正常。 我用在线 xml 编辑器编辑了它,它仍然运行良好。
就这些了。