如何进行具有标头安全性的PHP SOAP调用?

问题描述 投票:0回答:1

我正在尝试使用GetHotels客户端和普通的nusoap来调用SoapClient函数,并且在调用该函数时出现问题,它返回以下错误:

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
            )

    )

)

如果有人帮助我,我会很好

php web-services soap wsdl nusoap
1个回答
1
投票
发送带有主体的整个请求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);

现在您可以创建您的肥皂呼叫主体并提出您的要求。您可以从documentation中了解有关创建带有角色的节点的更多信息。

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

© www.soinside.com 2019 - 2024. All rights reserved.