如何使用标头安全性进行PHP SOAP调用?

时间:2016-12-15 20:31:15

标签: php web-services soap wsdl nusoap

我尝试使用GetHotels客户端和普通nusoap调用SoapClient函数,我在调用函数时遇到问题,它会返回以下错误:< / p>

Uncaught SoapFault exception: [a: InternalServiceFault] Object reference not set to an instance of an object.

我将此代码与nusoap_client

一起使用
   $client = new nusoap_client("http://amandaws.absolutent.it/Booking.svc" ,    'wsdl');
   $bodyxml =('<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
     xmlns:oas="http://docs.oasisopen.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
     xmlns:tem="http://tempuri.org/">
     <soapenv:Header>
     <oas:Security>
     <oas:UsernameToken>
     <oas:Username>XXX</oas:Username>
     <oas:Password>XXX</oas:Password>
     </oas:UsernameToken>
     </oas:Security>
     </soapenv:Header>
     <soapenv:Body>
     <tem:BGH_Request Language="IT">
     <tem:Criteria HotelCode="FID001" IDRegione="" IDProvincia="" IDComune="" IDLocalita="" IDLineaProdotto="" IDZona="" MaxResults="200" />
     </tem:BGH_Request>
     </soapenv:Body>
    </soapenv:Envelope>');
    $client->soap_defencoding = 'utf-8';
    $client->operation = "GetHotels";
    $result = $client->send($client->serializeEnvelope($bodyxml), "http://tempuri.org/IBooking/GetHotels");
    print_r($result);

Function that i need to call

当我打印$result时,我收到此数组消息

   Array
   (
  [faultcode] => a:InternalServiceFault
[faultstring] => Array
    (
        [!xml:lang] => en-GB
        [!] => Object reference not set to an instance of an object.
    )

[detail] => Array
    (
        [ExceptionDetail] => Array
            (
                [HelpLink] => 
                [InnerException] => 
                [Message] => Object reference not set to an instance of an object.
                [StackTrace] =>    at    Absolute.Web.Common.UoW.TransactionService.InTrasaction(Action actionbeBeforeCommit)
    at Castle.DynamicProxy.AbstractInvocation.Proceed()
    at Castle.Proxies.IBookingProxy.GetHotels(BookingGetHotelsMessageRequest request)
    at SyncInvokeGetHotels(Object , Object[] , Object[] )
    at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs)
    at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc)
   at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc)
   at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc& rpc)
  at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)
                [Type] => System.NullReferenceException
            )

    )

)

如果有人帮助我,我会非常好的

1 个答案:

答案 0 :(得分:0)

使用正文发送整个请求xml是错误的,您需要从头开始创建请求xml,您可以在documentation中阅读更多内容。

// Set your security header namespace
$headerNS = 'http://docs.oasisopen.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd';

//Create vars for username and password
$usernameNode = new SoapVar('your username', XSD_STRING, null, null, 'Username', $headerNS);
$passwordNode = new SoapVar('your password', XSD_STRING, null, null, 'Password', $headerNS);

// Create Username token node and add vars
$UsernameTokenNode = new SoapVar([$usernameNode, $passwordNode], SOAP_ENC_OBJECT, null, null, 'UsernameToken', $headerNS);

// Create security node
$securityNode = new SoapVar([$UsernameTokenNode], SOAP_ENC_OBJECT, null, null, 'Security', $headerNS);

// Now create a header with all above data
$header = [new SoapHeader($headerNS, 'Security', $securityNode, false)];

// Soap client options you choose
$options = [];

// Create your SoapClient and add header to client
$client = new SoapClient('Service Wsdl url', $options);
$client->__setSoapHeaders($header);

现在您可以创建您的soap呼叫主体并提出您的请求。您可以阅读更多关于使用documentation中的attiributes创建节点的信息。

使用$client->__getLastRequest();检查您的上一次验证请求。