使用结构将对象从PHP传递到SOAP Web服务

使用结构将对象从PHP传递到SOAP Web服务,php,web-services,object,soap,struct,Php,Web Services,Object,Soap,Struct,我从一个用PHP编写的web应用程序连接到一个SOAP web服务,在让服务接受我试图发送的对象时遇到问题。但是只是有时候,我不明白为什么某些特定的对象被成功地传递,而其他对象却没有 我使用的是PHP的SoapClient类,如果我使用uuGetFunctions()和uuGetTypes()方法,我会得到以下响应:(为了简洁起见,我不会列出每个方法和类型) 这是我想在Web服务中使用的postOrder方法: string(323) "respOrder postOrder(string $s

我从一个用PHP编写的web应用程序连接到一个SOAP web服务,在让服务接受我试图发送的对象时遇到问题。但是只是有时候,我不明白为什么某些特定的对象被成功地传递,而其他对象却没有

我使用的是PHP的SoapClient类,如果我使用uuGetFunctions()和uuGetTypes()方法,我会得到以下响应:(为了简洁起见,我不会列出每个方法和类型)

这是我想在Web服务中使用的postOrder方法:

string(323) "respOrder postOrder(string $siteId, string $secretKey, string $language, string $customerName, string $emailAddress, parmAddress $deliveryAddress, parmAddress $billingAddress, parmCreditCard $creditCard, string $cvv, parmOrderLineArray $orderLines, string $shippingCharge, string $reference, string $poNumber, string $text)"
这是一个给我带来麻烦的物体的例子,parmAddress:

  [1]=>
  string(176) "struct parmAddress {
 string addressLine1;
 string addressLine2;
 string addressLine3;
 string city;
 string countryCode;
 string name;
 string postalCode;
 string stateCode;
}
我试图用多种不同的方式构造这个特定的对象。使用PHP stdObject,创建一个名为parmAddress的PHP类的对象,甚至发送一个数组。不幸的是,我从web服务得到的响应总是如下所示。在本例中,我只是传递我在下面定义的其中一种类型的对象:

    //The type of object I send
    class parmAddress{
    public $addressLine1 = '891 Prairie Grass Drive';
    public $addressLine2 = '';
    public $addressLine3 = '';
    public $city = 'Las Vegas';
    public $countryCode = '1';
    public $name = 'Eric Dodson';
    public $postalCode = '89123';
    public $stateCode = 'NV';
    }

    //Or I've tried the stdObject as mentioned above
     $obj = new stdClass();
     $obj->addressLine1= '';
     $obj->addressLine2= '';
     $obj->addressLine3 = '';
     $obj->city = 'Las Vegas';
     $obj->countryCode = '1';
     $obj->name = 'Eric Dodson';
     $obj->postalCode = '89123';
     $obj->stateCode = 'NV';

    //Making the object and using the postOrder() method
    $parmaddress = new parmAddress();
    $order = $client->postOrder('user', 'pass', 'en', 'Eric Dodson', 'dodson@dodson.com', $parmaddress, $parmaddress, $parmcreditcard, '123', $parmorderlinearray, 0.00, 'No Comments');

    //The response given to me by the webservice
    object(stdClass)#6 (3) {
      ["code"]=>
      string(7) "failure"
      ["message"]=>
      string(21) "Invalid address name."
      ["orderNumber"]=>
      int(0)
    }
奇怪的是,我成功地以完全相同的方式发送了其他对象。例如,如果我以相同的方式创建parmPart对象,并在它请求的parmPart数组中使用这个getParts()方法传递它,那么它是成功的

$obj = new stdClass();
$obj->availabilityCode = '';
$obj->availableQuantity = '';
$obj->listPrice = '';
$obj->manufacturerCode = 'RPL';
$obj->partNumber = '341241';
$obj->price = '';
$obj->substitute = '';

$partsarray = array(
        0 => $obj
);

$partsresponsearray = $client->getParts('user', 'pass', 'en', $partsarray);
我认为重要的是要注意,web服务希望发送的是我相当不熟悉的结构,我希望我的问题就在于此。web服务的开发人员可以告诉我以下内容,但我还没有找到关于将对象从PHP发送到需要结构的web服务的任何其他信息:

“该消息是在未填充address name属性时发出的。我记得对于像此ParmadAddress这样的复合类型,您必须用PHP对其进行“编码”。我现在不确定语法。”

很明显,web服务认为我的“name”字符串是空的,我必须进行某种类型的编码,使它能够识别我发送的内容。有什么想法吗?谢谢你,我真的很感谢你的帮助

根据另一个用户的请求,以下是WSDL:

<?xml version='1.0' encoding='UTF-8'?><!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. 
    RI's version is JAX-WS RI 2.1.7-b01-. --><!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. 
    RI's version is JAX-WS RI 2.1.7-b01-. -->
<definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:tns="http://ws.reliableparts.net/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://ws.reliableparts.net/"
    name="RetailOrderServerService">
    <types>
        <xsd:schema>
            <xsd:import namespace="http://ws.reliableparts.net/"
                schemaLocation="http://www.reliableparts.net/dataservicetc/retail?xsd=1" />
        </xsd:schema>
    </types>
    <message name="getParts">
        <part name="siteId" type="xsd:string" />
        <part name="secretKey" type="xsd:string" />
        <part name="language" type="xsd:string" />
        <part name="parts" type="tns:parmPartArray" />
    </message>
    <message name="getPartsResponse">
        <part name="return" type="tns:parmPartArray" />
    </message>
    <message name="postOrder">
        <part name="siteId" type="xsd:string" />
        <part name="secretKey" type="xsd:string" />
        <part name="language" type="xsd:string" />
        <part name="customerName" type="xsd:string" />
        <part name="emailAddress" type="xsd:string" />
        <part name="deliveryAddress" type="tns:parmAddress" />
        <part name="billingAddress" type="tns:parmAddress" />
        <part name="creditCard" type="tns:parmCreditCard" />
        <part name="cvv" type="xsd:string" />
        <part name="orderLines" type="tns:parmOrderLineArray" />
        <part name="shippingCharge" type="xsd:string" />
        <part name="reference" type="xsd:string" />
        <part name="poNumber" type="xsd:string" />
        <part name="text" type="xsd:string" />
    </message>
    <message name="postOrderResponse">
        <part name="return" type="tns:respOrder" />
    </message>
    <portType name="RetailOrderServer">
        <operation name="getParts" parameterOrder="siteId secretKey language parts">
            <input message="tns:getParts" />
            <output message="tns:getPartsResponse" />
        </operation>
        <operation name="postOrder"
            parameterOrder="siteId secretKey language customerName emailAddress deliveryAddress billingAddress creditCard cvv orderLines shippingCharge reference poNumber text">
            <input message="tns:postOrder" />
            <output message="tns:postOrderResponse" />
        </operation>
    </portType>
    <binding name="RetailOrderServerPortBinding" type="tns:RetailOrderServer">
        <soap:binding transport="http://schemas.xmlsoap.org/soap/http"
            style="rpc" />
        <operation name="getParts">
            <soap:operation soapAction="" />
            <input>
                <soap:body use="literal" namespace="http://ws.reliableparts.net/" />
            </input>
            <output>
                <soap:body use="literal" namespace="http://ws.reliableparts.net/" />
            </output>
        </operation>
        <operation name="postOrder">
            <soap:operation soapAction="" />
            <input>
                <soap:body use="literal" namespace="http://ws.reliableparts.net/" />
            </input>
            <output>
                <soap:body use="literal" namespace="http://ws.reliableparts.net/" />
            </output>
        </operation>
    </binding>
    <service name="RetailOrderServerService">
        <port name="RetailOrderServerPort" binding="tns:RetailOrderServerPortBinding">
            <soap:address location="http://www.reliableparts.net/dataservicetc/retail" />
        </port>
    </service>
</definitions>

下面是使用$client->\uuu getLastRequest()的结果

xmlns:ns1=”http://ws.reliableparts.net/">
编辑
编辑
EN
埃里克·多德森
dodson@dodson.com
草原大道891号
拉斯维加斯
1.
埃里克·多德森
89123
内华达州
201605
4111111111111111
签证
123
RPL
341241
$99.99
1.
没有评论
0
一串
一串
一串

是否为每个
parmAddress
发送一个数组?它们应该是单个对象,而不是数组(如partsarray)。显示如何调用
postOrder()
。你能展示一下WSDL吗?我不是在为ParmadAddress发送数组,只是一个单独的对象。我将向原始post添加调用postOrder()的方式,以及添加WSDL。谢谢你的提问,我相信这将有助于我的文章的清晰度!您能否显示
$client->\uu getLastRequest()
(在调用
postOrder()之后)的结果。要使用此选项,必须在客户端上设置跟踪选项,例如,
$client=SoapClient(“some.wsdl”,array('trace'=>1))另外,您没有设置最后两个参数(poNumber,text)。我显示了上面$client->\uu getLastRequest()的结果,并尝试了两个缺少的字段。不幸的是,poNumber和文本添加也没有解决我的问题
xmlns:ns1="http://ws.reliableparts.net/">
   <SOAP-ENV:Body>
      <ns1:postOrder>
         <siteId>REDACTED</siteId>
         <secretKey>REDACTED</secretKey>
         <language>en</language>
         <customerName>Eric Dodson</customerName>
         <emailAddress>dodson@dodson.com</emailAddress>
         <deliveryAddress id="ref1">
            <addressLine1>891 Prairie Grass Drive</addressLine1>
            <addressLine2 />
            <addressLine3 />
            <city>Las Vegas</city>
            <countryCode>1</countryCode>
            <name>Eric Dodson</name>
            <postalCode>89123</postalCode>
            <stateCode>NV</stateCode>
         </deliveryAddress>
         <deliveryAddress href="#ref1" />
         <creditCard>
            <expirationDate>201605</expirationDate>
            <number>4111111111111111</number>
            <type>Visa</type>
         </creditCard>
         <cvv>123</cvv>
         <orderLines>
            <item>
               <manufacturerCode>RPL</manufacturerCode>
               <partNumber>341241</partNumber>
               <price>$99.99</price>
               <quantity>1</quantity>
               <text>No Comments</text>
            </item>
         </orderLines>
         <shippingCharge>0</shippingCharge>
         <reference>string</reference>
         <poNumber>string</poNumber>
         <text>string</text>
      </ns1:postOrder>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>