PHP SoapClient Web Hizmetleri ile arayarak - Nasıl?

4 Cevap php

Ben Web Hizmetleri ile deli başlangıç ​​kapalı gidiyorum. Ben PHP kullanarak aşağıdaki WSDL aramak ve hiçbir yerde elde tutmaya çalışıyorum:

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

I found the following piece of code on the net, from someone with similar problems, but I could not get it to work either:

$soap = new SoapClient('http://webservices.sabre.com/wsdl/sabreXML1.0.00/usg/SessionCreateRQ.wsdl', array( 'trace' => true, 'soap_version' => SOAP_1_2, "exceptions" => 0));

$eb = new EbXmlMessage();
$sec = new Security();
$scrq = new SessionCreateRQ();

try {
$omg = $soap->SessionCreateRQ($scrq, $sec,$eb);
}
catch (Exception $e)
{
print_r($e);
}
//debug
print "Request: \n".
htmlspecialchars($soap->_getLastRequestHeaders()) ."\n";
print "Request: \n".
htmlspecialchars($soap->
_getLastRequest()) ."\n";
print "Yanıt:\n".
$soap->_getLastResponseHeaders()."\n";
print "Yanıt:\n".
$soap->
_getLastResponse()."\n";

print_r($omg);
//the first envelope headers
class EbXmlMessage
{
public $From = array('PartyId' => 'mysite.com');
public $To = array('PartyId' => 'myprovider.com');
public $CPAId = 'ZZZZ';
public $ConversationId = 'myconv@id.com';
public $Service = 'Session';// or SessionCreate?
public $Action = 'SessionCreateRQ';
public $MessageData = array( 'MessageId' => 'messageid', 'Timestamp' => '2009-04-18T15:15:00Z');


}
//the security token
class Security {
public $Username = "xxxxx";
public $Password = "yyyyy";
public $Organization = "ZZZZ";
public $Domain = "DEFAULT";
}
//this is suppoused to be the payload, or the xml i need to send at the end
class SessionCreateRQ
{
public $POS = array(
'Source' => array(
'_'=>"",
'PseudoCityCode'=>'ZZZZ'
));
}


I keep getting the following error:

Yanıt: HTTP/1.1 500 Internal Server Error SOAPAction: "" Content-Type: text/xml;charset=utf-8 Date: Sun, 19 Apr 2009 22:21:34 GMT Connection: close Server: SWS

Yanıt:

soap-env:Client.InvalidEbXmlMessageUnable to internalize messagejavax.xml.soap.SOAPException: Unable to internalize message at com.sun.xml.messaging.saaj.soap.MessageImpl.(MessageImpl.java:135) at com.sun.xml.messaging.saaj.soap.MessageFactoryImpl.createMessage(MessageFactoryImpl.java:32) at com.sabre.universalservices.gateway.control.SoapProcessor.getRequest(SoapProcessor.java:263) at com.sabre.universalservices.gateway.control.WSGateway.handleRequest(WSGateway.java:380) at com.sabre.universalservices.gateway.control.WSGateway.doPost(WSGateway.java:306) at javax.servlet.http.HttpServlet.service(HttpServlet.java:710) at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:563) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263) at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:852) at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:584) at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1508) at java.lang.Thread.run(Thread.java:595) Caused by: javax.xml.soap.SOAPException: Invalid Content-Type:application/soap+xml at com.sun.xml.messaging.saaj.soap.MessageImpl.verify(MessageImpl.java:159) at com.sun.xml.messaging.saaj.soap.MessageImpl.(MessageImpl.java:91) ... 19 more

SoapFault Object ( [message:protected] => Unable to internalize message [string:private] => .....

Bu hizmet, sistemde beni doğrulayarak ve daha sonraki aramalarda kullanılmak üzere bir güvenlik nesnesi döndüren olmalı - bir dize ben sonra aşağıdaki aramalar için bir oturum değişkeni saklayabilirsiniz (?).

Herhangi bir yardım büyük takdir!

4 Cevap

Ben fark bir şey SoapFault Nesne bir faultcode değer olmasıdır:

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

Böylece hata ayıklama başlatmak için yararlı bir yol olabilir.

Ben XSD ve schema documentation için EbXmlMessage yapısını karşılaştırarak çalıştı, ama geçersiz sayıldı herhangi belirgin bir neden göremiyordu.

Eğer / xml metne Content-type başlığını değiştirmeyi denediniz mi?

Kullanmayı deneyin wsdl2php. Bu wsdl dosya üzerinden php sınıfları sağlar. Bu veri göndermek için php SoapClient kullanır.

İşte bunu yapmak için nasıl açıklayan güzel bir post:

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

Sadece NuSOAP kullanın. Ben PHP yerli SoapClient sevmiyorum. NuSOAP sen İşte nuSOAP .. birini yapmak konusunda endişelenmenize gerek yoktur ve burada basit bir örnek kod ya da tüm çalışma kodu indirebilirsiniz böylece sizin bir wsdl için oluşturduğu here:

Server:

<?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);
?>

Client:

<?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 . '</pre>';
    // At this point, you know the call that follows will fail
}

// Call the SOAP method
$result = $client->call('Hello', array('name' => 'Scott')); // Call function name, parameters;

// Check for a fault
if ($client->fault) {
    echo '<h2>Fault</h2><pre>';
    print_r($result);
    echo '</pre>';
} else {
    // Check for errors
    $err = $client->getError();
    if ($err) {
        // Display the error
        echo '<h2>Error</h2><pre>' . $err . '</pre>';
    } else {
        // Display the result
        echo '<h2>Result</h2><pre>';
        print_r($result);
    echo '</pre>';
    }
}
// Display the request and response
echo '<h2>Request</h2>';
echo '<pre>' . htmlspecialchars($client->request, ENT_QUOTES) . '</pre>';
echo '<h2>Response</h2>';
echo '<pre>' . htmlspecialchars($client->response, ENT_QUOTES) . '</pre>';
// Display the debug messages
echo '<h2>Debug</h2>';
echo '<pre>' . htmlspecialchars($client->debug_str, ENT_QUOTES) . '</pre>';
?>

Şimdi size sadece ?wsdl link yani üzerinde (webservice.php?wsdl) ekleyerek alabilirsiniz wsdl gereken bir istemci yapmak istediğinizde

Bu web hizmeti ile iyi şanslar :) yardımcı olur umarım.