WSO2 EI - входной параметр для запроса DSS с REST - PullRequest
0 голосов
/ 03 апреля 2020

Я пытался следовать этому руководству, чтобы создать DSS с выводом JSON: https://docs.wso2.com/display/EI620/Using+JSON+with+Data+Services

Он отлично работает с простым запросом, и я могу без проблем отформатировать вывод .

Сейчас я пытаюсь добавить входной параметр для фильтрации записей по идентификатору, но он не работает для меня. Мой 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>

Роберто

Ответы [ 2 ]

1 голос
/ 11 апреля 2020

Я решил проблему, но я не совсем уверен, как :) Я пытаюсь объяснить это с самого начала. Я сделал сервис с помощью мастера создания консоли WSO2, который создал сервис SOAP. Затем я отредактировал сервис с помощью онлайн-редактора xml и преобразовал его в REST. Он работает нормально в select, и выходные данные верны, но я не смог использовать входные параметры (как описано выше).

Во время моих тестов я изменил операцию getCount на POST, без результата, но когда Я положил его обратно, чтобы получить, что он начал работать волшебным образом. Другая операция все еще не работает.

Я думал, что где-то в WSO2 сохранена неправильная конфигурация, возможно, сделанная мастером. Я полностью удалил службу и перезапустил ее из пустого файла .dbs, написав его вручную. Я загрузил его в WSO2 с «загрузки», и он работает нормально. Я отредактировал его в онлайн-редакторе xml, и он все еще работает хорошо.

Вот и все.

1 голос
/ 05 апреля 2020

Можете ли вы попробовать то же самое, удалив / {idp} из ресурса в коде DSS.

<resource method="GET" path="getCount">
  <call-query href="getCount">
     <with-param name="idp" query-param="idp"/>
  </call-query>

...