我想用php soap客户端构建一个请求。 提供商向我们发送了样本请求。
这是我的代码;
$client = new SoapClient('http://myurl.com/TrevooWS.svc?wsdl' , array('trace' => true, 'exception' => false));
$auth_ns = 'http://schemas.datacontract.org/2004/07/Trevoo.WS.Entities.Authentication.IO';
$base_ns = 'http://schemas.datacontract.org/2004/07/Trevoo.WS.Entities.Base';
$object = new stdClass();
$form = new stdClass();
$form->Username = new SoapVar( 'USER' , XSD_STRING , null , null, 'trev1', $auth_ns);
$form->Password = new SoapVar( 'PASS' , XSD_STRING , null , null, 'trev1', $auth_ns);
$form->IsTestMode = new SoapVar( 1 , XSD_INTEGER, null , null, 'trev1', $auth_ns);
$form->ClientName = new SoapVar( 'CLIENT' , XSD_STRING , null , null, 'trev1', $auth_ns);
$form->ClientIP = new SoapVar( '0' , XSD_STRING , null , null, 'trev1', $auth_ns);
$object->request = new stdClass();
$object->request->Form = new SoapVar($form , SOAP_ENC_OBJECT, null , null, 'tem', $base_ns);
$object->request->Form->enc_namens = $auth_ns;
$object->request->Form->enc_name = 'trev1';
$object->request->enc_namens = $base_ns;
$object->request->enc_name = 'tem';
try{
$result = $client->Login( $object );
var_dump($result);
} catch (SoapFault $e){
echo $e;
var_dump($client->__getLastRequest());
var_dump($client->__getLastResponse());
}
来自提供商的预期请求。他们发送了此样本请求。
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/" xmlns:trev="http://schemas.datacontract.org/2004/07/Trevoo.WS.Entities.Base" xmlns:trev1="http://schemas.datacontract.org/2004/07/Trevoo.WS.Entities.Authentication.IO">
<soapenv:Header />
<soapenv:Body>
<tem:Login>
<tem:request>
<trev1:Form>
<trev1:ClientIP>0</trev1:ClientIP>
<trev1:ClientName>s</trev1:ClientName>
<trev1:IsTestMode>0</trev1:IsTestMode>
<trev1:Password>PASSWORD</trev1:Password>
<trev1:Username>USERNAME</trev1:Username>
</trev1:Form>
</tem:request>
</tem:Login>
</soapenv:Body>
</soapenv:Envelope>
我得到了什么;
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://schemas.datacontract.org/2004/07/Trevoo.WS.Entities.Authentication.IO" xmlns:ns2="http://tempuri.org/">
<SOAP-ENV:Body>
<ns2:Login>
<ns2:request>
<ns1:Form>
<ns1:Username>USERNAME</ns1:Username>
<ns1:Password>PASSWORD</ns1:Password>
<ns1:IsTestMode>1</ns1:IsTestMode>
<ns1:ClientName>CLIENT</ns1:ClientName>
<ns1:ClientIP>0</ns1:ClientIP>
</ns1:Form>
</ns2:request>
</ns2:Login>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
这是对Login方法的回复。
<?xml version="1.0" encoding="UTF-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<s:Fault>
<faultcode xmlns:a="http://schemas.microsoft.com/net/2005/12/windowscommunicationfoundation/dispatcher">a:InternalServiceFault</faultcode>
<faultstring xml:lang="tr-TR">String reference not set to an instance of a String.
Parameter name: s</faultstring>
<detail>
<ExceptionDetail xmlns="http://schemas.datacontract.org/2004/07/System.ServiceModel" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<HelpLink i:nil="true" />
<InnerException i:nil="true" />
<Message>String reference not set to an instance of a String.
Parameter name: s</Message>
<StackTrace>at System.Text.Encoding.GetBytes(String s)
at Trevoo.Utilities.Crypto.MD5Hash(String input) in c:\Trevoo_TFS\*****\trunk\main\Trevoo\Projects\Core\Trevoo.Core\Utilities\Crypto.cs:line 131
at Trevoo.Accounts.AuthController.ReadonlyLogin(LoginRequest request) in c:\Trevoo_TFS\*****\trunk\main\Trevoo\Projects\Core\Trevoo.Core\Accounts\AuthController.cs:line 22
at Trevoo.Accounts.AuthController.Login(LoginRequest request) in c:\Trevoo_TFS\*****\trunk\main\Trevoo\Projects\Core\Trevoo.Core\Accounts\AuthController.cs:line 10
at Trevoo.WS.Services.Base.Login(T_LoginRequest request) in c:\Trevoo_TFS\*****\trunk\main\Trevoo\Projects\WS\Trevoo.WS\Services\Authentication\Login.cs:line 13
at SyncInvokeLogin(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)</StackTrace>
<Type>System.ArgumentNullException</Type>
</ExceptionDetail>
</detail>
</s:Fault>
</s:Body>
</s:Envelope>
我看不出有什么问题。你能帮帮我吗?
答案 0 :(得分:1)
您需要按预期订购元素
订购必须;
->ClientIP
->ClientName
->IsTestMode
->Password
->Username