我正在尝试使用PHP和nusoap将数据提交到web服务。我调用的web服务操作位于以下位置:http://service.leads360.com/ClientService.asmx?op=AddLeads
该操作的预期参数为username as string、password as string和leads as XmlNode。对于这个XmlNode,他们给出了模式和xml文档的示例:
http://service.leads360.com/Documentation/Schemas/Client/Leads.Request.xsd
http://service.leads360.com/Documentation/Examples/Client/AddLeads.leads.xml
因此,我复制了他们提供的xml文档并将其转换为数组,将该数组与username和password一起放入另一个名为$params的数组中并执行
$result = $client->call('AddLeads', $params);不幸的是,它给了我以下错误:
[faultcode] => soap:Server
[faultstring] => System.Web.Services.Protocols.SoapException: Server was unable to process request. ---> System.NullReferenceException: Object reference not set to an instance of an object.
at LeadManager.Business.XmlHelper.RemoveNamespace(XmlNode xml, Boolean asElement) in c:\Code\DEV\LeadManager_Business\Utilities\XmlHelper.cs:line 323
at LeadManagerService.ClientService.InsertSerializedLeads(XmlNode descriptors)
at LeadManagerService.ClientService.InsertLeads(XmlNode descriptor)
at LeadManagerService.Invoker 1.Invoke(ServiceContext context, String methodName, ICredentials credentials, Object parameters, Requestor requestor)
at LeadManagerService.ClientService.AddLeads(String username, String password, XmlNode leads)
--- End of inner exception stack trace ---我将我的代码粘贴到:http://pastebin.com/7jbPGuqn。
我还粘贴了下面作为leads参数传递的数组。请告诉我该数组是否表示示例中的xml文档,以及它是否是有效的XmlNode。
Array
(
[Leads] => Array
(
[Lead] => Array
(
[0] => Array
(
[Status] => Array
(
)
[Status_attr] => Array
(
[StatusId] => 2
)
[Campaign] => Array
(
)
[Campaign_attr] => Array
(
[CampaignId] => 3
)
[Agent] => Array
(
)
[Agent_attr] => Array
(
[AgentId] => 1
)
[Fields] => Array
(
[Field] => Array
(
[0] => Array
(
)
[1] => Array
(
)
[0_attr] => Array
(
[FieldId] => 2
[Value] => F1Name
)
[1_attr] => Array
(
[FieldId] => 3
[Value] => L1Name
)
[2] => Array
(
)
[2_attr] => Array
(
[FieldId] => 4
[Value] => a@y.com
)
[3] => Array
(
)
[3_attr] => Array
(
[FieldId] => 5
[Value] => 111111111
)
[4] => Array
(
)
[4_attr] => Array
(
[FieldId] => 6
[Value] =>
)
)
)
)
[1] => Array
(
[Fields] => Array
(
[Field] => Array
(
[0] => Array
(
)
[1] => Array
(
)
[0_attr] => Array
(
[FieldId] => 2
[Value] => F2Name
)
[1_attr] => Array
(
[FieldId] => 3
[Value] => L2Name
)
[2] => Array
(
)
[2_attr] => Array
(
[FieldId] => 4
[Value] => b@y.com
)
[3] => Array
(
)
[3_attr] => Array
(
[FieldId] => 5
[Value] => 222222222
)
)
)
)
[2] => Array
(
[Fields] => Array
(
[Field] => Array
(
[0] => Array
(
)
[1] => Array
(
)
[0_attr] => Array
(
[FieldId] => 2
[Value] => F3Name
)
[1_attr] => Array
(
[FieldId] => 3
[Value] => L3Name
)
[2] => Array
(
)
[2_attr] => Array
(
[FieldId] => 4
[Value] => c@y.com
)
[3] => Array
(
)
[3_attr] => Array
(
[FieldId] => -9999999
[Value] => 333333333
)
)
)
)
)
)
)发布于 2011-08-20 04:00:53
与元素的值是简单的int或string不同,XmlNode是一个更复杂的结构,它是一个XML元素。
在服务的WSDL中,您可以找到AddLeads元素的以下内容:
<s:element name="AddLeads">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="username" type="s:string"/>
<s:element minOccurs="0" maxOccurs="1" name="password" type="s:string"/>
<s:element minOccurs="0" maxOccurs="1" name="leads">
<s:complexType mixed="true">
<s:sequence>
<s:any/>
</s:sequence>
</s:complexType>
</s:element>
</s:sequence>
</s:complexType>
</s:element>这是AddLeads元素的架构。该架构将用于验证您提供的标记。
注意,username和password的类型是string,而leads是"any“复杂类型。这将意味着一条类似如下的消息:
<soapenv:Body>
<AddLeads>
<username>foo</username>
<password>bar</password>
<leads>
You may enter ANY elements at this point
</leads>
</AddLeads>
</soapenv:Body>但是“任何”复杂类型的定义都有点过于宽泛,因此web服务的创建者决定将其限制为他们认为有用的信息。下面的模式限制了AddLeads操作上下文中的"any“:
http://service.leads360.com/Documentation/Schemas/Client/Leads.Request.xsd
下面是一个有效的实例:
http://service.leads360.com/Documentation/Examples/Client/AddLeads.leads.xml
我不知道PHP,但是您的代码必须生成一条符合web服务WSDL类型和leads类型的消息。
我建议您使用像SoapUI这样的工具来创建调用web服务的请求。一旦您获得一个成功响应的有效消息内容,调整您的PHP代码以生成相同的格式。您还会发现(另一个工具) TCP Monitor在查看客户端和web服务之间交换的消息方面非常有用。
https://stackoverflow.com/questions/7112667
复制相似问题