Текущее время: Вт, дек 18 2018, 21:16

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 38 ]  На страницу 1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: Ошибка при парсинге ответа WEB-сервиса
СообщениеДобавлено: Чт, мар 03 2016, 19:10 
Ассистент
Ассистент

Зарегистрирован:
Ср, дек 16 2015, 15:30
Сообщения: 38
День добрый!

Для интеграции ERP с внешним веб-сервисом в ESR созданы необходимые интерфейсы (ERP - исходящий, Web-сервис - входящий), типы, мэпинг и т.д. Уже описывал условие задачи (а Chaser009 очень сильно помог с решением, спасибо большое) в этой теме.

На данный момент все необходимые объекты созданы в ESR, успешно сгенерирован Proxy в ERP, созданы необходимые (по аналогии с этим) объекты в Integration Repository. Сделал небольшой тест в ERP:
Code:
REPORT Z_TEST.

data: getInfoObj type ref to ZMETEO_CO_SC_GET_USER_INFO,
      exc type ref to CX_AI_SYSTEM_FAULT,
      fault type ref to ZMETEO_CX_FAULT_SOAPMESSAGE,
      request type ZMETEO_USER_INFO1,
      response type ZMETEO_USER_GET_INFO_RESPONSE.

request-user_info-user_name = 'USERNAME'.
request-user_info-user_passw = 'PASSWORD'.

try.
  create object getInfoObj.
  getInfoObj->sc_get_user_info( exporting !output = request
                                                importing !input = response ).

  write 'Success'.
catch ZMETEO_CX_FAULT_SOAPMESSAGE into fault.
  write fault->get_text( ).
catch CX_AI_SYSTEM_FAULT into exc.
  write exc->get_text( ).
endtry.


В этом тесте всегда срабатывает исключение CX_AI_SYSTEM_FAULT, выводится MESSAGE.GENERAL. В журналах мониторинга творится следующее:
Изображение
Изображение

Изображение
Изображение
Изображение

Как мне представляется, ключевым здесь является сообщение второго скрина "Error during parsing body item http://schemas.xmlsoap.org/soap/envelope/^Fault using class com.sap.aii.af.sdk.xi.mo.SOAPFault at ^faultactor/ caused by --- Missing faultstring", однако как это правильно понять - ума не приложу. Сам веб-сервис прекрасно работает и прекрасно работал в моменты отправки запросов.

Подскажите, в чем может быть проблема?


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Ошибка при парсинге ответа WEB-сервиса
СообщениеДобавлено: Пт, мар 04 2016, 05:32 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Пн, авг 29 2011, 09:54
Сообщения: 318
Откуда: Владивосток, Россия
Пол: Мужской
Здравствуйте!

Возможность есть на принимающей стороне логи посмотреть?
500 Internal server error - это общее описание ошибки, сервер не смог обработать запрос, но причины могут быть разные. Проверьте еще раз правильность формирования сообщения, на всякий случай. Бывало и такое: не добавленный, например, в нужном месте неймспейс в xml приводил к ошибкам.

Я бы взял, например, SOAP UI, импортировал туда wsdl, попробовал бы отправить сообщение. Если все хорошо, взял бы сообщение в том виде, как оно у вас формируется, и отправил в этом виде. Дальше - по результату.

_________________
У меня два правила:
1. Не говорить всего, что знаю.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Ошибка при парсинге ответа WEB-сервиса
СообщениеДобавлено: Пт, мар 04 2016, 10:14 
Ассистент
Ассистент

Зарегистрирован:
Ср, дек 16 2015, 15:30
Сообщения: 38
Chaser009 написал:
Здравствуйте!

Возможность есть на принимающей стороне логи посмотреть?
500 Internal server error - это общее описание ошибки, сервер не смог обработать запрос, но причины могут быть разные. Проверьте еще раз правильность формирования сообщения, на всякий случай. Бывало и такое: не добавленный, например, в нужном месте неймспейс в xml приводил к ошибкам.

Я бы взял, например, SOAP UI, импортировал туда wsdl, попробовал бы отправить сообщение. Если все хорошо, взял бы сообщение в том виде, как оно у вас формируется, и отправил в этом виде. Дальше - по результату.


Веб-сервис сторонний, обращаться к администриации сервиса, к сожалению, нет возможности (и даже если обратиться - не факт, что они будут ради нас копаться в логах).

В SOAP UI все запросы в обязательном порядке тестирую по предоставленной WSDL, все работает как часы. На абсолютно любое сообщение сервис отвечает - если сообщение не отвечает формату - отвечает корректой SOAP-ошибкой.

Насчет взять сообщение в том виде, как оно формируется - что имеется ввиду? Насколько я понимаю, мне доступны только тесты преобразований в ESR, то есть я могу получить смапленное сообщение с выхода теста - эти сообщения смотрел, сообщение формируется верное, согласно схеме. Однако что именно в итоге отправляется веб-сервису - не знаю (как оно упаковывается в операцию, как преобразовывается в SOAP). Можно где то взять готовое сформированное SOAP-сообщение на выходе PI?

И насчет нейм спейсов - во внутреннем интерфейсе никакие сторонние определения имен не используются. Внешний интерфейс полностью импортирован из WSDL, в которой все необходимые имена прописаны. Насколько понимаю, они оттуда и должны браться и добавляться в исходящий запрос в теги SOAPENV. Или все же что то куда то нужно руками добавить?


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Ошибка при парсинге ответа WEB-сервиса
СообщениеДобавлено: Пт, мар 04 2016, 11:07 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Пн, авг 29 2011, 09:54
Сообщения: 318
Откуда: Владивосток, Россия
Пол: Мужской
Вот то, что у вас на выходе в тесте мэппинга, и возьмите. Само сообщение. Оно у вас должно быть в таком же виде, как и в SOAP UI структура для запроса. И именно в таком виде оно прилетит из PI на вход сервису. Его вставьте в SOAP UI и выполните запрос.

_________________
У меня два правила:
1. Не говорить всего, что знаю.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Ошибка при парсинге ответа WEB-сервиса
СообщениеДобавлено: Пт, мар 04 2016, 11:22 
Ассистент
Ассистент

Зарегистрирован:
Ср, дек 16 2015, 15:30
Сообщения: 38
Chaser009 написал:
Вот то, что у вас на выходе в тесте мэппинга, и возьмите. Само сообщение. Оно у вас должно быть в таком же виде, как и в SOAP UI структура для запроса. И именно в таком виде оно прилетит из PI на вход сервису. Его вставьте в SOAP UI и выполните запрос.

Не совсем понял. В тесте у нас мэпятся только структуры сообщений. По SOAP передается операция с переданным ей сформированным сообщением. То есть после приведения сообщения в нужный формат оно должно упаковаться в соответствующую операцию (для этого мы указываем операции в мэпинге операций), после чего все это должно упаковаться в SOAPENV теги. Для всего этого и существуют мэпинг операций и адаптер SOAP. По крайней мере я так себе представлял.

По факту - у меня есть исходящий запрос с операцией на входе веб-сервиса с названием "cidiuser_GetInfo", которая принимает сообщение типа "cidiuser_GetInfoRequest". Мэпинг значений настраивается для моего типа сообщения и типа "cidiuser_GetInfoRequest". В тесте, естественно, получаем сообщение типа "cidiuser_GetInfoRequest", но только его. Нет никаких тегов SOAPENV, нет указания, что должна выполниться операция "cidiuser_GetInfo".

Но, даже если принимать, что сообщение должно отправляться голой структурой, веб сервис все равно отвечает вполне себе корректным сообщением-ошибкой на это:
Code:
<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
   <SOAP-ENV:Body>
      <SOAP-ENV:Fault>
         <faultcode xsi:type="xsd:int">1</faultcode>
         <faultactor xsi:type="xsd:string">CIDIUser</faultactor>
         <faultstring xsi:type="xsd:string">No rights</faultstring>
         <detail xsi:type="xsd:string"/>
      </SOAP-ENV:Fault>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
<!---->


В каком месте я не прав?

P.S. Если имелось ввиду, что нужно взять эту структуру и вставить в необходимые SOAP-теги с описанием вызываемой операции, то это делал - тут все корректно.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Ошибка при парсинге ответа WEB-сервиса
СообщениеДобавлено: Пт, мар 04 2016, 11:33 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Пн, авг 29 2011, 09:54
Сообщения: 318
Откуда: Владивосток, Россия
Пол: Мужской
Поняли вы все правильно. Просто у вас в SOAP UI так же уже wsdl разобран по операциям, и для каждой сгенерирован request. Так? А внутри него находится структура, соответствующая входному сообщению. При выполнении запроса SOAP UI сам оборачивает это сообщение всеми дополнительными тэгами и отправляет серверу (ну точнее, у вас в request'е уже все тэги есть). Поэтому, вам надо всего лишь структуру сообщения заполнить. Вот на выходе вашего мэппинга как раз и должна получиться такая структура сообщения, уже заполненная.

Тот результат, что вы привели, - это ответ на сообщение, вставленное из мэппинга?

Давайте так:

1. выложите запрос из SOAP UI с заполненными данными и ответ сервера.
2. тот же запрос, только со вставленной из результатов мэппинга заполненной структурой и опять же ответ сервера.

_________________
У меня два правила:
1. Не говорить всего, что знаю.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Ошибка при парсинге ответа WEB-сервиса
СообщениеДобавлено: Пт, мар 04 2016, 11:43 
Ассистент
Ассистент

Зарегистрирован:
Ср, дек 16 2015, 15:30
Сообщения: 38
Chaser009 написал:
Поняли вы все правильно. Просто у вас в SOAP UI так же уже wsdl разобран по операциям, и для каждой сгенерирован request. Так? А внутри него находится структура, соответствующая входному сообщению. При выполнении запроса SOAP UI сам оборачивает это сообщение всеми дополнительными тэгами и отправляет серверу. Поэтому, вам надо всего лишь структуру сообщения заполнить. Вот на выходе вашего мэппинга как раз и должна получиться такая структура сообщения, уже заполненная.

Тот результат, что вы привели, - это ответ на сообщение, вставленное из мэппинга?


Насчет SOAP UI. В окне отправки запроса у меня следующий текст:
Code:
<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:met="[i]WEB_SERVICE_NAMESPACE_URI[/i]">
   <soapenv:Header/>
   <soapenv:Body>
      <met:cidiuser_GetInfo soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
         <user_name>MyName</user_name>
         <user_passw>MyPass</user_passw>
         <token />
         <debug />
      </met:cidiuser_GetInfo>
   </soapenv:Body>
</soapenv:Envelope>


На этот запрос я получаю корректный ответ с данными. На выходе теста мэпинга у меня следующее:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<ns1:cidiuser_GetInfoRequest xmlns:ns1="[i]WEB_SERVICE_NAMESPACE_URI[/i]">
   <user_name>MyName</user_name>
   <user_passw>MyPass</user_passw>
   <token />
   <debug" />
</ns1:cidiuser_GetInfoRequest>


Вы имеете ввиду, что нужно это сообщение подставить в SOAP UI вместо тега <met:cidiuser_GetInfo > с соответствующим алиасом пространства имен? Если так, то подставлял - все работает в SOAP UI.


Цитата:
Тот результат, что вы привели, - это ответ на сообщение, вставленное из мэппинга?


Да, это ответ на запрос (без обертки SOAP):
Code:
<?xml version="1.0" encoding="UTF-8"?>
<ns1:cidiuser_GetInfoRequest xmlns:ns1="[i]WEB_SERVICE_NAMESPACE_URI[/i]">
   <user_name>MyName</user_name>
   <user_passw>MyPass</user_passw>
   <token />
   <debug" />
</ns1:cidiuser_GetInfoRequest>


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Ошибка при парсинге ответа WEB-сервиса
СообщениеДобавлено: Пт, мар 04 2016, 11:47 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Пн, авг 29 2011, 09:54
Сообщения: 318
Откуда: Владивосток, Россия
Пол: Мужской
<met:cidiuser_GetInfo - требуемое сервисом сообщение
<ns1:cidiuser_GetInfoRequest - ваше сообщение

Разницу видите?

_________________
У меня два правила:
1. Не говорить всего, что знаю.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Ошибка при парсинге ответа WEB-сервиса
СообщениеДобавлено: Пт, мар 04 2016, 11:55 
Ассистент
Ассистент

Зарегистрирован:
Ср, дек 16 2015, 15:30
Сообщения: 38
Chaser009 написал:
<met:cidiuser_GetInfo - требуемое сервисом сообщение
<ns1:cidiuser_GetInfoRequest - ваше сообщение

Разницу видите?


met:cidiuser_GetInfo это как раз название операции, которая на вход принимает сообщение типа cidiuser_GetInfoResponse, а не сообщения. Это то, что я задаю в мапинге операций а не сообщений. Выдержка из WSDL:

Code:
<operation name="cidiuser_GetInfo">
    <documentation>read user info</documentation>
    <input message="tns:cidiuser_GetInfoRequest"/>
    <output message="tns:cidiuser_GetInfoResponse"/>
</operation>

<message name="cidiuser_GetInfoRequest">
  <part name="user_name" type="xsd:string" />
  <part name="user_passw" type="xsd:string" />
  <part name="token" type="xsd:string" />
  <part name="debug" type="xsd:int" />
</message>


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Ошибка при парсинге ответа WEB-сервиса
СообщениеДобавлено: Пт, мар 04 2016, 11:57 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Пн, авг 29 2011, 09:54
Сообщения: 318
Откуда: Владивосток, Россия
Пол: Мужской
Просто попробуйте в своем вставленном результате мэппинга GetInfoRequest поменять на GetInfo. И выполните запрос.

_________________
У меня два правила:
1. Не говорить всего, что знаю.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Ошибка при парсинге ответа WEB-сервиса
СообщениеДобавлено: Пт, мар 04 2016, 12:01 
Ассистент
Ассистент

Зарегистрирован:
Ср, дек 16 2015, 15:30
Сообщения: 38
Chaser009 написал:
Просто попробуйте в своем вставленном результате мэппинга GetInfoRequest поменять на GetInfo. И выполните запрос.


Прошу прощения, как это сделать? В мэпинге операций я задаю операцию, из которой по нажатию кнопки "Read operations" автоматически тип и название сообщения из WSDL считывается и устанавливается на это значение (GetInfoRequest). То есть руками я поправить его не могу без правки WSDL, который предоставляет веб-сервис.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Ошибка при парсинге ответа WEB-сервиса
СообщениеДобавлено: Пт, мар 04 2016, 12:06 
Ассистент
Ассистент

Зарегистрирован:
Ср, дек 16 2015, 15:30
Сообщения: 38
ceib написал(а):
Chaser009 написал:
Просто попробуйте в своем вставленном результате мэппинга GetInfoRequest поменять на GetInfo. И выполните запрос.


Прошу прощения, как это сделать? В мэпинге операций я задаю операцию, из которой по нажатию кнопки "Read operations" автоматически тип и название сообщения из WSDL считывается и устанавливается на это значение (GetInfoRequest). То есть руками я поправить его не могу без правки WSDL, который предоставляет веб-сервис.


Прошу прощения, поторопился с ответом. Сделал это в SOAP UI - ответ сервиса корректный, все работает. Мой запрос:
Code:
<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:met="http://...">
<soapenv:Header/>
<soapenv:Body>

<ns1:cidiuser_GetInfo xmlns:ns1="http://...">
   <user_name>MyName</user_name>
   <user_passw>MyPass</user_passw>
   <token/>
   <debug>1</debug>
</ns1:cidiuser_GetInfo>
     
</soapenv:Body>
</soapenv:Envelope>


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Ошибка при парсинге ответа WEB-сервиса
СообщениеДобавлено: Пт, мар 04 2016, 12:15 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Пн, авг 29 2011, 09:54
Сообщения: 318
Откуда: Владивосток, Россия
Пол: Мужской
Вот странность как раз в том, что, судя по soap ui, у вас сервис требует один тип сообщения, а импорт wsdl в pi дает другой результат.

_________________
У меня два правила:
1. Не говорить всего, что знаю.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Ошибка при парсинге ответа WEB-сервиса
СообщениеДобавлено: Пт, мар 04 2016, 12:19 
Ассистент
Ассистент

Зарегистрирован:
Ср, дек 16 2015, 15:30
Сообщения: 38
Chaser009 написал:
Вот странность как раз в том, что, судя по soap ui, у вас сервис требует один тип сообщения, а импорт wsdl в pi дает другой результат.


Судя по этой выдержке из WSDL:
Code:
<operation name="cidiuser_GetInfo">
    <documentation>read user info</documentation>
    <input message="tns:cidiuser_GetInfoRequest"/>
    <output message="tns:cidiuser_GetInfoResponse"/>
</operation>

<message name="cidiuser_GetInfoRequest">
  <part name="user_name" type="xsd:string" />
  <part name="user_passw" type="xsd:string" />
  <part name="token" type="xsd:string" />
  <part name="debug" type="xsd:int" />
</message>


На стороне веб сервиса все корректно - сообщение должно быть типа cidiuser_GetInfoRequest, но указываться в запросе должна операция cidiuser_GetInfo. То есть получается, что PI неправильно обрабатывает WSDL? Вместо названия операции подставляет название типа в сообщении, так? Если так, то может быть сможете подсказать, куда можно обратиться в подобных нестандартных случаях, особенно если нужно оперативаное решение проблемы (сроки начинают поджимать) ?

И еще раз огромное спасибо за помощь!


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Ошибка при парсинге ответа WEB-сервиса
СообщениеДобавлено: Пт, мар 04 2016, 12:32 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Пн, авг 29 2011, 09:54
Сообщения: 318
Откуда: Владивосток, Россия
Пол: Мужской
Ну если разбираться некогда, попробуйте у себя а в xslt подменить корневой тэг сообщения на Get_Info, как в request в soap ui, и проверьте, что получится.

_________________
У меня два правила:
1. Не говорить всего, что знаю.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 38 ]  На страницу 1, 2, 3  След.

Часовой пояс: UTC + 4 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB