Интегратор WSO2: отсутствует тело ответа в запросе REST API GET

Я использую WSO2 Integrator 6.6.0, чтобы сделать блокирующий HTTP GET для REST API, который возвращает ответ JSON (HTTP 200 OK).

Но я никогда не вижу тела ответа внутри своих последовательностей. Я не уверен, что делаю не так, исчерпав всю доступную документацию и другие темы.

Последовательность выполнения вызова (упрощенная до анонимности), которая впоследствии регистрирует ответ:

<!-- Remove XML body as not needed for GET request -->
<payloadFactory media-type="json">
    <format></format>
    <args></args>
</payloadFactory>
<header name="Accept" value="application/json" scope="transport"/>
<property name="NO_ENTITY_BODY" value="true" scope="axis2" type="BOOLEAN" />

<call blocking="true">
    <endpoint>
         <http method="GET" uri-template="http://my-api/order-status">
    </endpoint>
</call>
<property name="RESPONSE" scope="default" type="STRING" value="true"/>
<log level="full">
    <property name="response-log" value="Received response"/>
    <property expression="$body" name="response-body"/>
    <property expression="json-eval($)" name="json-eval-body"/>
</log>

В результате получается просто строка журнала - без тела ответа вообще!

ИНФОРМАЦИЯ {org.apache.synapse.mediators.builtin.LogMediator} - Кому: http: // my-api / order-status, WSAction: urn: mediate, SOAPAction: urn: mediate, MessageID: ID: 414d51204343494153303131202020209ca4175f28ac422e, Directionac422e , response-log = Полученный ответ, response-body = ‹soapenv: Body xmlns: soapenv = http: //schemas.xmlsoap.org/soap/envelope/› ‹/ soapenv: Body›, json-eval-body = {} , Полезная нагрузка: {}

Я вижу запрос в своем приложении API, а также могу видеть, что он правильно возвращает тело ответа в своих журналах. Кроме того, используя Postman для выполнения того же запроса, я получаю следующий ответ JSON с 200 OK и Content-Type appication / json:

{
   "order_status": "NOT_FOUND"
}

Внутри WSO2 ничего не вижу! Я хочу иметь возможность преобразовать ответ в формат XML.

Что могло быть не так?


person Petteri Pertola    schedule 22.07.2020    source источник


Ответы (3)


Перед выполнением вызова REST необходимо удалить заголовки из основного вызова.

Поместите этот фрагмент перед посредником вызовов:

<property name = "FORCE_HTTP_CONTENT_LENGTH" scope = "axis2" type = "STRING" value = "true" />
     <property action = "remove" name = "REST_URL_POSTFIX" scope = "axis2" />
     <property action = "remove" name = "TRANSPORT_HEADERS" scope = "axis2" />

Как я понял это должно решить.

person Flaviano O. Silva    schedule 22.07.2020

Можете ли вы изменить свойство NO_ENTITY_BODY следующим образом и снова попробовать это посредничество.

<property name="NO_ENTITY_BODY" action="remove" scope="axis2"/>
person Shanaka Premarathna    schedule 22.07.2020

Упростив эту конфигурацию для этого вопроса, я пропустил то, что в моей прокси-службе установлено следующее свойство:

<property name="OUT_ONLY" scope="default" type="STRING" value="true"/>

Означает, что WSO2 игнорирует ответ от API. Удаление этого свойства разрешило проблему для следующей конфигурации:

<header name="Accept" value="application/json" scope="transport" />
<property action="remove" name="NO_ENTITY_BODY" scope="axis2"/>
<property name="messageType" scope="axis2" type="STRING" value="application/json"/>
<call blocking="true">
    <endpoint key="conf:/endpoints/FX_TRADING_API_ORDERSTATUS.xml"/>
</call>
person Petteri Pertola    schedule 23.07.2020
comment
Да, если у вас есть свойство OUT_ONLY, EI игнорирует любые ответы от внешнего вызова. - person Arunan Sugunakumar; 23.07.2020