0

I am very new to SOAP request and I am trying to figure out how this works.

I am trying to make a request for a Sales Order Object. This is the wsdl code that I received:

<s:element name="Start">
<s:complexType>
    <s:sequence>
        <s:element minOccurs="0" maxOccurs="1" name="company" type="s:string" />
        <s:element minOccurs="0" maxOccurs="1" name="orders" type="tns:ArrayOfSalesOrdersSalesOrder" />
    </s:sequence>
</s:complexType>
</s:element>
<s:complexType name="ArrayOfSalesOrdersSalesOrder">
    <s:sequence>
        <s:element minOccurs="0" maxOccurs="unbounded" name="SalesOrdersSalesOrder" nillable="true">
            <s:complexType>
                <s:sequence>
                    <s:element minOccurs="0" maxOccurs="1" form="unqualified" name="CustomerNumber" type="s:string" />
                    <s:element minOccurs="0" maxOccurs="1" form="unqualified" name="OrderNumber" type="s:string" />
                    <s:element minOccurs="0" maxOccurs="1" form="unqualified" name="Currency" type="s:string" />
                    <s:element minOccurs="0" maxOccurs="1" form="unqualified" name="CustomerComment" type="s:string" />
                    <s:element minOccurs="0" maxOccurs="1" form="unqualified" name="OrderReference" type="s:string" />
                    <s:element minOccurs="0" maxOccurs="1" form="unqualified" name="FirstName" type="s:string" />
                    <s:element minOccurs="0" maxOccurs="1" form="unqualified" name="LastName" type="s:string" />
                    <s:element minOccurs="0" maxOccurs="1" form="unqualified" name="Street" type="s:string" />
                    <s:element minOccurs="0" maxOccurs="1" form="unqualified" name="ZipCode" type="s:string" />
                    <s:element minOccurs="0" maxOccurs="1" form="unqualified" name="City" type="s:string" />
                    <s:element minOccurs="0" maxOccurs="1" form="unqualified" name="Country" type="s:string" />
                    <s:element minOccurs="1" maxOccurs="1" form="unqualified" name="Discount" type="s:decimal" />
                    <s:element minOccurs="0" maxOccurs="unbounded" form="unqualified" name="ChargeHeader">
                        <s:complexType>
                            <s:sequence>
                                <s:element minOccurs="0" maxOccurs="1" form="unqualified" name="Code" type="s:string" />
                                <s:element minOccurs="1" maxOccurs="1" form="unqualified" name="Value" type="s:decimal" />
                            </s:sequence>
                        </s:complexType>
                    </s:element>
                    <s:element minOccurs="0" maxOccurs="unbounded" form="unqualified" name="Orderline">
                        <s:complexType>
                            <s:sequence>
                                <s:element minOccurs="0" maxOccurs="1" form="unqualified" name="PartNumber" type="s:string" />
                                <s:element minOccurs="1" maxOccurs="1" form="unqualified" name="Qty" type="s:decimal" />
                                <s:element minOccurs="1" maxOccurs="1" form="unqualified" name="FreeIssue" type="s:boolean" />
                                <s:element minOccurs="1" maxOccurs="1" form="unqualified" name="Discount" type="s:decimal" />
                                <s:element minOccurs="0" maxOccurs="unbounded" form="unqualified" name="ChargeLine">
                                    <s:complexType>
                                        <s:sequence>
                                            <s:element minOccurs="0" maxOccurs="1" form="unqualified" name="Code" type="s:string" />
                                            <s:element minOccurs="1" maxOccurs="1" form="unqualified" name="Value" type="s:decimal" />
                                        </s:sequence>
                                    </s:complexType>
                                </s:element>
                            </s:sequence>
                        </s:complexType>
                    </s:element>
                </s:sequence>
            </s:complexType>
        </s:element>
    </s:sequence>
</s:complexType>

I figured out I had to do something like the following:

$order = array( 
    'company' => '10',
    'orders' => array(
        'SalesOrdersSalesOrder' => array(
            'CustomerNumber'        => '12345234',
            'OrderNumber'           => '0000001',
            'Currency'              => 'EUR',
            'CustomerComment'       => 'Dit is de comment',
            'FirstName'             => 'Lex',
            'LastName'              => 'Test',
            'Street'                => 'Teststraat 12',
            'ZipCode'               => '1231df',
            'City'                  => 'Testing',
            'Country'               => 'NL',
            'Discount'              => 11.11,
            'ChargeHeader'          => array(
                'Code'          => '001',
                'Value'         => 99.99
            ),
            'OrderLine'             => array (
                'PartNumber'    => '01-001-000-42',
                'Qty'           => 1,
                'FreeIssue'     => false,
                'Discount'      => 1.11,
                'ChargeLine'    => array(
                    'Code'          => '001',
                    'Value'         => 33.33
                )
            ),                            
            'OrderLine'             => array (
                'PartNumber'    => '01-001-000-42',
                'Qty'           => 1,
                'FreeIssue'     => false,
                'Discount'      => 1.11,
                'ChargeLine'    => array(
                    'Code'          => '001',
                    'Value'         => 33.33
                )
            ),                            
            'OrderLine' => array (
                'PartNumber'    => '01-001-000-42',
                'Qty'           => 1,
                'FreeIssue'     => false,
                'Discount'      => 1.11,
                'ChargeLine'    => array(
                    'Code'          => '001',
                    'Value'         => 33.33
                )
            )
        )
    )
);

However when I try to post this to the Client i get the following response back:

The SalesOrder element has incomplete content. List of expected modular elements: ChargeHeader, Orderline.

In the wsdl it sais the following about ChargeHeader:

<s:element minOccurs="0" maxOccurs="unbounded" form="unqualified" name="Orderline">
<s:complexType>

So I was wondering how to make the following work? I thought a complexType was an array but it's probably something else.

All help is appreciated.

Lex
  • 49
  • 6
  • Probably you need to give the element ChargeHeader to the request only you can set is as null. And some reading for [complexTypes](https://www.w3schools.com/xml/el_complextype.asp). And don't you need to response or send xml back to the wsdl as it is a xml styled of communication? – Wouter Veen Apr 10 '18 at 15:00
  • @WouterVeen I am using SoapClient in php: $client = new \SoapClient('address of wsdl'); $client->Start( $order ); – Lex Apr 10 '18 at 15:06
  • Oke i think you wil find your awnser [here](https://stackoverflow.com/questions/3780543/how-to-pass-an-array-into-a-php-soapclient-call) – Wouter Veen Apr 10 '18 at 15:09

1 Answers1

0

You can't include multiple values with the same key in an array in PHP. Each one will overwrite the previous one.

The WSDL says that both SalesOrdersSalesOrder and Orderline should be an array of those values.

Also, it should be Orderline not OrderLine.

$order = array(
    'company' => '10',
    'orders' => array(
        'SalesOrdersSalesOrder' => array(
            array(
                'CustomerNumber'        => '12345234',
                'OrderNumber'           => '0000001',
                'Currency'              => 'EUR',
                'CustomerComment'       => 'Dit is de comment',
                'FirstName'             => 'Lex',
                'LastName'              => 'Test',
                'Street'                => 'Teststraat 12',
                'ZipCode'               => '1231df',
                'City'                  => 'Testing',
                'Country'               => 'NL',
                'Discount'              => 11.11,
                'ChargeHeader'          => array(
                    'Code'          => '001',
                    'Value'         => 99.99
                ),
                'OrderLine'             => array(
                    array (
                        'PartNumber'    => '01-001-000-42',
                        'Qty'           => 1,
                        'FreeIssue'     => false,
                        'Discount'      => 1.11,
                        'ChargeLine'    => array(
                            'Code'          => '001',
                            'Value'         => 33.33
                        )
                    ),
                    array (
                        'PartNumber'    => '01-001-000-42',
                        'Qty'           => 1,
                        'FreeIssue'     => false,
                        'Discount'      => 1.11,
                        'ChargeLine'    => array(
                            'Code'          => '001',
                            'Value'         => 33.33
                        )
                    ),
                    array (
                        'PartNumber'    => '01-001-000-42',
                        'Qty'           => 1,
                        'FreeIssue'     => false,
                        'Discount'      => 1.11,
                        'ChargeLine'    => array(
                            'Code'          => '001',
                            'Value'         => 33.33
                        )
                    )
                ),
            )
        )
    )
);
jjok
  • 601
  • 5
  • 12
  • Hee @jjok you are right about the overwrite, however this unfortunately did not solve the problem of the missing ChargeHeader and OrderLine. – Lex Apr 10 '18 at 15:15
  • You also have the formatting of `SalesOrdersSalesOrder` wrong. I've updated my answer. – jjok Apr 10 '18 at 15:31