繁体   English   中英

WSO2 EI - 使用 REST 进行 DSS 查询的输入参数

[英]WSO2 EI - Input parameter on DSS Query with REST

I tried to follow this tutorial to create a DSS with a JSON output: https://docs.wso2.com/display/EI620/Using+JSON+with+Data+Services

它可以通过简单的查询正常工作,我可以毫无问题地格式化 output。

现在我正在尝试添加一个输入参数来按 ID 过滤记录,但它对我不起作用。 我的 REST,如教程中所述,是:GET 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: {}

我也尝试过: GET 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 &lt;&gt; 'BATCH'</sql>
      <result escapeNonPrintableChar="true" outputType="json">{&#xd;    "list": {&#xd;      "item": [{&#xd;         "id": "$ID_ABILITAZIONE",&#xd;          "service": {&#xd;               "id": "$ID_SERVIZIO",&#xd;              "info": "$DESCR_SERVIZIO"&#xd;          },&#xd;         "cfUser": "$CF_UTENTE",&#xd;            "channel": {&#xd;               "id": "$ID_CANALE_NOTIFICA",&#xd;               "info": "$CANALE_NOTIFICA"&#xd;         },&#xd;         "address": {&#xd;               "id": "$ID_CONTATTO",&#xd;              "info": "$CONTATTO"&#xd;            }&#xd;      }]&#xd; }&#xd;}</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">{&#xd;    "list": {&#xd;      "item": [{&#xd;         "items": "$recno",&#xd;         "service": {&#xd;               "id": "$ID_SERVIZIO",&#xd;              "info": "$DESCR_SERVIZIO"&#xd;          },&#xd;         "channel": {&#xd;               "id": "$ID_CANALE_NOTIFICA",&#xd;               "info": "$CANALE_NOTIFICA"&#xd;         }&#xd;      }]&#xd; }&#xd;}</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>

我解决了这个问题,但我不太确定如何:) 我试着从一开始就解释它。 我通过 WSO2 控制台创建向导创建了该服务,该向导构建了一个 SOAP 服务。 然后我使用在线 xml 编辑器编辑了该服务,并将其转换为 REST。 它在 select 中运行良好,并且输出正确,但我无法使用输入参数(如上所述)。

在我的测试期间,我将“getCount”操作更改为 POST,但没有任何结果,但是当我将其放回 GET 时,它开始神奇地工作。 其他操作仍然无法正常工作。

我认为 WSO2 某处存储了错误的配置,可能是由向导创建的。 我完全删除了该服务并从一个 empty.dbs 文件重新启动,手动编写它。 我通过“上传”将它加载到 WSO2 中,它工作正常。 我使用在线 xml 编辑器对其进行了编辑,它仍然可以正常工作。

就这样。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM