Разбор SOAP от запроса cURL к веб-сервисам - PullRequest
1 голос
/ 23 августа 2011

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


Мой XML-запрос отправлен в веб-службу:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://www.bring.no/logistics/shippingguide/1.0"> 
   <soapenv:Header/> 
   <soapenv:Body> 
      <ns:ShippingGuideRequest> 
         <ns:UserInformation> 
            <ns:Usercode>ae34ab27-2023-41f5-b800-013f0d0a6015</ns:Usercode> 
         </ns:UserInformation> 
         <ns:ProductIds> 
            <ns:ProductId>SERVICEPAKKE</ns:ProductId> 
         </ns:ProductIds> 
         <ns:Packages> 
        <ns:Package packageId="7,"> 
               <ns:GrossWeight unitCode="GRM">500</ns:GrossWeight> 
               <ns:FromPostalCode>4045</ns:FromPostalCode> 
               <ns:ToPostalCode>4045</ns:ToPostalCode> 
            </ns:Package> 
         </ns:Packages> 
      </ns:ShippingGuideRequest> 
   </soapenv:Body> 
</soapenv:Envelope>

Я НЕ могу использовать встроенный SoapClient, который поставляется с PHP5 и выше, так как я не одобряю принуждение моих пользователей к настройке этого, поскольку я испытал, что многие из моих тестовых случаев не имели. Я попытался выполнить запрос, используя обычные сокеты, а также cURL, но это не дало никаких других результатов.


Результат, полученный от звонка, следующий:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header/><SOAP-ENV:Body><ns:ShippingGuideResponse xmlns:ns="http://www.bring.no/logistics/shippingguide/1.0"><ns:Packages><ns:Package packageId="7,"><ns:Product><ns:ProductId>SERVICEPAKKE</ns:ProductId><ns:GuiInformation><ns:SortOrder>11</ns:SortOrder><ns:MainDisplayCategory>Hent sendingen selv</ns:MainDisplayCategory><ns:SubDisplayCategory/><ns:DisplayName>På postkontor eller post i butikk</ns:DisplayName><ns:ProductName>Klimanøytral Servicepakke</ns:ProductName><ns:DescriptionText>Madla. Åpningstider Man - Fre: 1000-1800, Lør: 1000-1500</ns:DescriptionText><ns:HelpText>Sendingen er en Klimanøytral Servicepakke som blir levert til mottakers postkontor/ post i butikk. Mottaker kan velge å hente sendingen på et annet postkontor/post i butikk enn sitt lokale. Mottaker varsles om at sendingen er ankommet via SMS, e-post eller hentemelding i postkassen. Transporttid er normalt 1-3 virkedager, avhengig av strekning. Sendingen kan spores ved hjelp av sporingsnummeret.</ns:HelpText><ns:Tip/></ns:GuiInformation><ns:Price currencyIdentificationCode="NOK"><ns:PackagePriceWithoutAdditionalServices><ns:AmountWithoutVAT>66.00</ns:AmountWithoutVAT><ns:VAT>16.50</ns:VAT><ns:AmountWithVAT>82.50</ns:AmountWithVAT></ns:PackagePriceWithoutAdditionalServices></ns:Price><ns:ExpectedDelivery><ns:WorkingDays>1</ns:WorkingDays><ns:UserMessage/><ns:AlternativeDeliveryDates/></ns:ExpectedDelivery></ns:Product></ns:Package></ns:Packages><ns:TraceMessages><ns:Message>You are using an outdated schema version (1). Most recent schema version is 4.</ns:Message></ns:TraceMessages></ns:ShippingGuideResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>

Как видите, в запросе XML отсутствуют начальные теги XML, и поэтому SimpleXMLElement и подобные ему в PHP не могут его интерпретировать.

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

$ ch = curl_init ("http://fraktguide.bring.no/fraktguide/ws/1.0/");

curl_setopt ($ ch, CURLOPT_HTTPHEADER, массив ('Content-Type: text / xml; charset = utf-8', 'Content-Length:'. Strlen ($ xml)));

curl_setopt ($ ch, CURLOPT_POST, 1);

curl_setopt ($ ch, CURLOPT_TIMEOUT, 30);

curl_setopt ($ ch, CURLOPT_PORT, 80);

curl_setopt ($ ch, CURLOPT_FOLLOWLOCATION, 1);

curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, 1);

curl_setopt ($ ch, CURLOPT_SSL_VERIFYPEER, 0);

curl_setopt ($ ch, CURLOPT_SSL_VERIFYHOST, 0);

curl_setopt ($ ch, CURLOPT_POSTFIELDS, $ xml);

$ result = curl_exec ($ ch);

1 Ответ

0 голосов
/ 24 августа 2011

Данные были извлечены, но чтение их без контрольной точки казалось проблемой.

Решение было обойти это с помощью XPath.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...