Вызов веб-сервисов с помощью PHP SoapClient - Как? - PullRequest
3 голосов
/ 20 апреля 2009

Я схожу с ума, начиная с веб-сервисов. Я пытаюсь вызвать следующий WSDL, используя PHP, и не получаю ничего:

http://webservices.sabre.com/wsdl/sabreXML1.0.00/usg/SessionCreateRQ.wsdl

Я нашел следующий фрагмент кода в сети от кого-то с похожими проблемами, но я также не смог заставить его работать:

$soap = new SoapClient('<a href="http://webservices.sabre.com/wsdl/sabreXML1.0.00/usg/SessionCreateRQ.wsdl" rel="nofollow noreferrer">http://webservices.sabre.com/wsdl/sabreXML1.0.00/usg/SessionCreateRQ.wsdl</a>', array( 'trace' => true, 'soap_version' => SOAP_1_2, "exceptions" => 0)); </p> <p>$eb = new EbXmlMessage(); <br> $sec = new Security(); <br> $scrq = new SessionCreateRQ(); </p> <p>try { <br> $omg = $soap->SessionCreateRQ($scrq, $sec,$eb); <br> } <br> catch (Exception $e)<br> { <br> print_r($e); <br> } <br> //debug <br> print "Request: \n". <br> htmlspecialchars($soap->__getLastRequestHeaders()) ."\n"; <br> print "Request: \n". <br> htmlspecialchars($soap->__getLastRequest()) ."\n"; <br> print "Response: \n". <br> $soap->__getLastResponseHeaders()."\n"; <br> print "Response: \n". <br> $soap->__getLastResponse()."\n"; <br> <br> print_r($omg); <br> //the first envelope headers <br> class EbXmlMessage <br> { <br> public $From = array('PartyId' => 'mysite.com'); <br> public $To = array('PartyId' => 'myprovider.com');<br> public $CPAId = 'ZZZZ'; <br> public $ConversationId = 'myconv@id.com'; <br> public $Service = 'Session';// or SessionCreate?<br> public $Action = 'SessionCreateRQ'; <br> public $MessageData = array( 'MessageId' => 'messageid', 'Timestamp' => '2009-04-18T15:15:00Z');<br> <br><br> } <br> //the security token <br> class Security { <br> public $Username = "xxxxx"; <br> public $Password = "yyyyy"; <br> public $Organization = "ZZZZ"; <br> public $Domain = "DEFAULT"; <br> } <br> //this is suppoused to be the payload, or the xml i need to send at the end <br> class SessionCreateRQ <br> { <br> public $POS = array( <br> 'Source' => array( <br> '_'=>"", <br> 'PseudoCityCode'=>'ZZZZ' <br> )); <br> } <br> <br>
Я продолжаю получать следующую ошибку:

Ответ: HTTP / 1.1 500 Внутренняя ошибка сервера SOAPAction: "" Тип содержимого: text / xml; charset = utf-8 Дата: вс, 19 апреля 2009 22:21:34 GMT Подключение: закрыть Сервер: SWS

Ответ:

soap-env: Client.InvalidEbXmlMessageUnable для интернализации messagejavax.xml.soap.SOAPException: Невозможно усвоить сообщение в com.sun.xml.messaging.saaj.soap.MessageImpl. (MessageImpl.java:135) в com.sun.xml.messaging.saaj.soap.MessageFactoryImpl.createMessage (MessageFactoryImpl.java:32) в com.sabre.universalservices.gateway.control.SoapProcessor.getRequest (SoapProcessor.java:263) в com.sabre.universalservices.gateway.control.WSGateway.handleRequest (WSGateway.java:380) в com.sabre.universalservices.gateway.control.WSGateway.doPost (WSGateway.java:306) в javax.servlet.http.HttpServlet.service (HttpServlet.java:710) в javax.servlet.http.HttpServlet.service (HttpServlet.java:803) в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:290) в org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:206) в org.apache.catalina.core.StandardWrapperValve.invoke (StandardWrapperValve.java:233) в org.apache.catalina.core.StandardContextValve.invoke (StandardContextValve.java:175) в org.apache.catalina.core.StandardHostValve.invoke (StandardHostValve.java:128) в org.apache.catalina.valves.ErrorReportValve.invoke (ErrorReportValve.java:102) в org.apache.catalina.valves.AccessLogValve.invoke (AccessLogValve.java:563) в org.apache.catalina.core.StandardEngineValve.invoke (StandardEngineValve.java:109) в org.apache.catalina.connector.CoyoteAdapter.service (CoyoteAdapter.java:263) в org.apache.coyote.http11.Http11AprProcessor.process (Http11AprProcessor.java:852) в org.apache.coyote.http11.Http11AprProtocol $ Http11ConnectionHandler.process (Http11AprProtocol.java:584) в org.apache.tomcat.util.net.AprEndpoint $ Worker.run (AprEndpoint.java:1508) at java.lang.Thread.run (Thread.java:595) Причина: javax.xml.soap.SOAPException: неверный Тип контента: приложение / мыло + xml на com.sun.xml.messaging.saaj.soap.MessageImpl.verify (MessageImpl.java:159) в com.sun.xml.messaging.saaj.soap.MessageImpl. (MessageImpl.java:91) ... еще 19

Объект SoapFault ( [message: protected] => Невозможно усвоить сообщение [string: private] => .....

Эта служба должна проверять меня в системе и возвращать объект безопасности для использования в последующих вызовах - строку (?), Которую я затем могу сохранить в переменной сеанса для следующих вызовов.

Любая помощь с благодарностью!

Ответы [ 4 ]

1 голос
/ 23 октября 2011

Попробуйте использовать wsdl2php . Это делает классы php из файла wsdl. Он использует php's SoapClient для отправки данных.

Вот хороший пост, объясняющий, как это сделать:

http://itworkarounds.blogspot.com/2011/10/simple-soap-client-with-wsdl2php-using.html

0 голосов
/ 18 августа 2013

Просто используйте nuSOAP. Я не люблю PHP родной SoapClient. NuSoap генерирует для вас wsdl, так что вам не нужно беспокоиться о том, как его создать. Вот nuSOAP и вот простой пример кода, или вы можете скачать весь рабочий код здесь :

Сервер :

<?php
// include the SOAP classes
require_once('nuSOAP/lib/nusoap.php');

function HelloWorld(){
return 'HelloWorld'; // Returns HelloWorld string
}

function Hello($name){
return 'Hello '.$name; // Returns Hello with name string parameter
}



// create the server object
$server = new nusoap_server();

// Initialize WSDL support
$server->configureWSDL('webservicenamespace', 'urn:webservicenamespace');



$server->register('HelloWorld',             array(), array('result' => 'xsd:string')); //xsd:string; xsd:boolean; xsd:integer and so on..
$server->register('Hello',                  array('name' => 'xsd:string'), array('result' => 'xsd:string')); // array('parametername' => 'parametertype'),array('result' => 'returntype');


if (isset($error))
{
    $fault =
            $server->fault('soap:Server','',$error);
}

// send the result as a SOAP response over HTTP $HTTP_RAW_POST_DATA
$post = file_get_contents('php://input');
$server->service($post);
?>

Клиент :

<code><?php
// Pull in the NuSOAP code
require_once('nuSOAP/lib/nusoap.php');

// Create the client instance

$client = new nusoap_client('http://pathtourl/sample_webservice.php?wsdl', true);

// Check for an error
$err = $client->getError();
if ($err) {
    // Display the error
    echo '<h2>Constructor error</h2><pre>' . $err . '
'; // На данный момент вы знаете, что следующий вызов не удастся } // Вызов метода SOAP $ result = $ client-> call ('Hello', array ('name' => 'Scott')); // Вызов имени функции, параметров; // Проверка на неисправность if ($ client-> fault) { echo '

Fault

';
    print_r($result);
    echo '
'; } еще { // Проверка на ошибки $ err = $ client-> getError (); if ($ err) { // Показать ошибку echo '

Ошибка

' . $err . '
'; } еще { // Показать результат echo '

Результат

';
        print_r($result);
    echo '
'; } } // Показать запрос и ответ echo '

Request

'; echo '
' . htmlspecialchars($client->request, ENT_QUOTES) . '
'; echo '

Response

'; echo '
' . htmlspecialchars($client->response, ENT_QUOTES) . '
'; // Показать сообщения отладки echo '

Debug

'; echo '
' . htmlspecialchars($client->debug_str, ENT_QUOTES) . '
'; ?>

Теперь, когда вы хотите сделать клиента нужным вам wsdl, вы можете просто получить его, добавив ? Wsdl в ссылку, т.е.

Надеюсь, это поможет :) Удачи с вашим веб-сервисом.

0 голосов
/ 28 августа 2009

Вы пытались изменить заголовок Content-type на text / xml?

0 голосов
/ 16 июля 2009

Я заметил одну вещь: в объекте SoapFault есть значение код ошибки :

[faultcode] => soap-env:Client.InvalidEbXmlMessage

Так что это может быть полезным способом начать отладку.

Я попытался сравнить структуру вашего EbXmlMessage с XSD и документацией схемы , но я не смог увидеть ни одной очевидной причины, по которой он был объявлен недействительным.

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