我尝试使用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);
当我打印$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
)
)
)
如果有人帮助我,我会非常好的
答案 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();
检查您的上一次验证请求。