Apache Synapse/WSO2 API Нет ответа

Я хочу отправить запрос в базу данных и вернуть результат клиенту с помощью WSO2 rest API. Вот конфиг синапса:

<api xmlns="http://ws.apache.org/ns/synapse" name="RestDBLookup" context="/dblookup">
   <resource methods="POST GET" uri-template="/channel/{name}" protocol="http">
      <inSequence>
         <dblookup>
            <connection>
               <pool>
                  <password>pass</password>
                  <driver>oracle.jdbc.driver.OracleDriver</driver>
                  <url>jdbc:oracle:thin:@localhost:1521:ORCL</url>
                  <user>user</user>
               </pool>
            </connection>
            <statement>
               <sql>SELECT ID, CHANNEL_NAME FROM CHANNEL where CHANNEL_NAME = ?</sql>
               <parameter expression="get-property('uri.var.name')" type="VARCHAR"/>
               <result name="channel_id" column="ID"/>
            </statement>
         </dblookup>
         <log level="custom">
            <property name="ID" expression="get-property('channel_id')"/>
            <property name="State" value="after db"/>
         </log>
      </inSequence>
      <outSequence>
         <property name="messageType" value="application/json" scope="axis2" type="STRING"/>
         <log level="full"/>
         <send/>
      </outSequence>
      <faultSequence/>
   </resource>
</api>

Когда я вызываю URL-адрес http://localhost:8280/dblookup/channel/someChannel с оставшимся клиентом, я получаю журнал после dblookup

LogMediator ID = 40810162, State = after db

но outSequence не выполняется, и я получаю только статус 202 Accepted на остальном клиенте без тела.

Итак, вопрос в том, как я могу создать какой-то ответ (например, в формате JSON) и отправить его клиенту?


person Evgeni Dimitrov    schedule 11.01.2016    source источник


Ответы (2)


Посредничество синапса имеет три потока:

  • inSequence — обрабатывать входящий запрос и определять, как запрос должен быть обработан (посредник) перед отправкой в ​​целевую конечную точку.
  • outSequence - обрабатывать ответ, возвращающийся из конечной точки, и определять, как ответ должен быть обработан (посредник) перед отправкой клиенту.
  • faultSequence — если ошибка произошла во время посредничества службы, то сообщение об ошибке передается в последовательность ошибок. Вы можете записать логику в последовательности ошибок в соответствии с вашими требованиями (зарегистрировать ошибку, удалить сообщение и отправить ошибку).

Теперь давайте посмотрим на ваш вариант использования. То, что вы пытаетесь сделать, это запросить базу данных в inSequence. Также вы получаете результат. Но проблема в том, что результат не отправляется обратно клиенту. Здесь проблема заключалась в том, что посредничество, которое вы написали в inSequence, не вызывало outSequence. Поэтому outSequence не получает удар. Например, если вы вызываете серверную службу в inSequence, ответ попадает в outSequence. В вашем случае ответ возвращается в inSequence. Поэтому мы можем сделать любой из следующих вариантов:

  1. Добавление посредника <loopback/> после посредника </log> в inSequence. Это переместит сообщение из inSequence в outSequence.
  2. Переместите логику, написанную в outSequence, в inSequence. Затем добавьте <respond/> в конце inSequence. Это отправит текущее сообщение обратно клиенту. Таким образом, вам может не понадобиться outSequence.

Надеюсь, ответ выше поможет.

Ваше здоровье!

person Indika Sampath    schedule 12.01.2016

Как предложила Индика, я использовал <respond/> и получил такую ​​конфигурацию:

<api context="/dblookup" name="RestDBLookup" xmlns="http://ws.apache.org/ns/synapse">
  <resource methods="POST GET" protocol="http" uri-template="/channel/{name}">
    <inSequence>
      <dblookup>
        <connection>
          <pool>
            <password>pass</password>
            <driver>oracle.jdbc.driver.OracleDriver</driver>
            <url>jdbc:oracle:thin:@localhost:1521:ORCL</url>
            <user>user</user>
          </pool>
        </connection>
        <statement>
          <sql><![CDATA[SELECT ID, CHANNEL_NAME FROM CHANNEL where CHANNEL_NAME = ?]]></sql>
          <parameter expression="get-property('uri.var.name')" type="VARCHAR"/>
          <result column="ID" name="channel_id"/>
        </statement>
      </dblookup>
      <log level="custom">
        <property expression="get-property('channel_id')" name="ID"/>
        <property name="State" value="after db"/>
      </log>
      <payloadFactory media-type="json">
        <format>
               {
                  "channelId":"$1"
               }
            </format>
        <args>
          <arg evaluator="xml" expression="get-property('channel_id')"/>
        </args>
      </payloadFactory>
      <property action="remove" name="NO_ENTITY_BODY" scope="axis2"/>
      <property name="messageType" scope="axis2" type="STRING" value="application/json"/>
      <respond/>
    </inSequence>
    <outSequence/>
    <faultSequence/>
  </resource>
</api>
person Evgeni Dimitrov    schedule 12.01.2016