PHP中SOAP请求的XML结构问题

时间:2017-05-04 15:53:31

标签: php xml soap

我正在尝试在PHP中模拟SOAP请求,并且在我的端点收到它之后,它会像:

<?xml version="1.0" encoding="UTF-8"?>
<Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns2="http://xml.apache.org/xml-soap" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <Body>
        <Callback>
            <param0 xsi:type="ns2:Map">
                <item>
                    <key xsi:type="xsd:string">ProposalID</key>
                    <value xsi:type="xsd:int">XXXXXXXX</value>
                </item>
                <item>
                    <key xsi:type="xsd:string">ProposalStatus</key>
                    <value xsi:type="ns2:Map">
                        <item>
                            <key xsi:type="xsd:string">IsParked</key>
                            <value xsi:type="xsd:boolean">false</value>
                        </item>
                        <item>
                            <key xsi:type="xsd:string">Status</key>
                            <value xsi:type="xsd:string">Accepted</value>
                        </item>
                    </value>
                </item>
                <item>
                    <key xsi:type="xsd:string">CustomerAddress</key>
                    <value xsi:type="SOAP-ENC:Struct">
                        <HouseNumber xsi:type="xsd:int">XXXXXXXX</HouseNumber>
                        <HouseName xsi:nil="true" />
                        <Flat xsi:nil="true" />
                        <Street xsi:type="xsd:string">XXXXXXXX</Street>
                        <District xsi:type="xsd:string">XXXXXXXX</District>
                        <Town xsi:type="xsd:string">XXXXXXXX</Town>
                        <County xsi:type="xsd:string">XXXXXXXX</County>
                        <Postcode xsi:type="xsd:string">XXXXXXXX</Postcode>
                    </value>
                </item>
                <item>
                    <key xsi:type="xsd:string">Snags</key>
                    <value xsi:nil="true" />
                </item>
                <item>
                    <key xsi:type="xsd:string">ChecklistConditions</key>
                    <value xsi:type="ns2:Map">
                        <item>
                            <key xsi:type="xsd:string">ChecklistConditions</key>
                            <value SOAP-ENC:arrayType="SOAP-ENC:Struct[3]" xsi:type="SOAP-ENC:Array">
                                <item xsi:type="SOAP-ENC:Struct">
                                    <Type xsi:type="xsd:string">ID Verified</Type>
                                    <Status xsi:type="xsd:string">Please select</Status>
                                    <Satisfied xsi:type="xsd:boolean">false</Satisfied>
                                    <SatisfiedOn xsi:nil="true" />
                                </item>
                                <item xsi:type="SOAP-ENC:Struct">
                                    <Type xsi:type="xsd:string">Goods Quantity</Type>
                                    <Status xsi:type="xsd:string">Please select</Status>
                                    <Satisfied xsi:type="xsd:boolean">false</Satisfied>
                                    <SatisfiedOn xsi:nil="true" />
                                </item>
                                <item xsi:type="SOAP-ENC:Struct">
                                    <Type xsi:type="xsd:string">Delivery Notification</Type>
                                    <Status xsi:type="xsd:string">Please select</Status>
                                    <Satisfied xsi:type="xsd:boolean">false</Satisfied>
                                    <SatisfiedOn xsi:nil="true" />
                                </item>
                            </value>
                        </item>
                    </value>
                </item>
                <item>
                    <key xsi:type="xsd:string">ClientReference</key>
                    <value xsi:type="xsd:string">XXXXXXXX</value>
                </item>
            </param0>
        </Callback>
    </Body>
</Envelope>

正确的请求看起来像这样(使用正确的元素格式,而不是项目标记内的键/值格式化等):

<?xml version="1.0" encoding="utf-8"?>
<Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Body>
        <Callback>
            <ProposalID>XXXXXXXX</ProposalID>
            <ProposalStatus IsParked="false">
                <Status>Accepted</Status>
            </ProposalStatus>
            <CustomerAddress>
                <HouseNumber>XXXXXXXX</HouseNumber>
                <HouseName>XXXXXXXX</HouseName>
                <Flat />
                <Street>XXXXXXXX</Street>
                <District />
                <Town>XXXXXXXX</Town>
                <County>XXXXXXXX</County>
                <Postcode>XXXXXXXX</Postcode>
            </CustomerAddress>
            <ChecklistConditions>
                <ChecklistCondition Type="Delivery Note">
                    <Status>Not Received</Status>
                    <Satisfied>false</Satisfied>
                </ChecklistCondition>
                <ChecklistCondition Type="CCA Documents Received">
                    <Status>Not Received</Status>
                    <Satisfied>false</Satisfied>
                </ChecklistCondition>
            </ChecklistConditions>
            <ClientReference>XXXXXXXX</ClientReference>
        </Callback>
    </Body>
</Envelope>

我通过以下PHP代码生成模拟请求:

public function generateMockCallbackArray($ClientReference, $ProposalID, $status)
{
    // first, make any required constituent objects
    $ProposalStatus = new ProposalStatus(false, $status);
    $CustomerAddress = new Address("XXXXXXXX", NULL, NULL, "XXXXXXXX", "XXXXXXXX", "XXXXXXXX", "XXXXXXXX", "XXXXXXXX");
    $Snags = NULL;
    $ChecklistConditions = new ChecklistConditions(
        array(
            new ChecklistCondition("ID Verified", "Please select", false, NULL),
            new ChecklistCondition("Goods Quantity", "Please select", false, NULL),
            new ChecklistCondition("Delivery Notification", "Please select", false, NULL)
        )
    );

    // build into Callback object and return as array
    $Callback = new Callback($ProposalID, $ProposalStatus, $CustomerAddress, $Snags, $ChecklistConditions, $ClientReference);

    return [
        "Callback" => $Callback->toArray()
    ];
}

谁能看到我哪里出错了?如果我可以对generateMockCallbackArray()方法进行更改,那将是理想的。感谢。

1 个答案:

答案 0 :(得分:1)

你应该使用WSDL到php生成器来停止想知道如何构建你的请求。

尝试PackageGenerator项目,然后告诉我。