PHP Webservice multi-dimensional request en response

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Anoniem: 30961

Topicstarter
Ik moet een webservice bouwen die aan de hand van meerder artikelnummers (Ean-nummers), interne artikelen opzoeken en het interne artikelnummer, beschikbaarheid en de prijs als response sturen.

Wat ik heb is het volgende:

De request ziet er als volgt uit:
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="utf-8"?>
<FindArticles>
        <ArticleQuery>
                <ArticleNumber/>
                <EanCode>3528702337622</EanCode>
                <Quantity>4</Quantity>
        </ArticleQuery>
        <ArticleQuery>
                <ArticleNumber/>
                <EanCode>3528704566938</EanCode>
                <Quantity>1</Quantity>
        </ArticleQuery>
</FindArticles>


Dus er komen meerder artikelen binnen in de webservice.
Al deze artikelen moeten worden uitgelezen in een array (kan volgens mij met SimpleXML, correct me if I'm wrong).

Dan de code van mijn voorlopige webservice:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
<?php
// Pull in the NuSOAP code
require_once('lib/nusoap.php');

$ns="http://www.domein.nl/Webservice";

$server = new soap_server();
$server->configureWSDL('testService', $ns);
$server->wsdl->schemaTargetNamespace = $ns;

$server->wsdl->addComplexType(
                              'Article',
                              'complexType',
                              'struct',
                              'all',
                              '',
                              array(
                                    'statusCode' => array('statusCode',
                                                          type=>'xsd:string'),
                                    'articleNumber' => array('articleNumber',
                                                          type=>'xsd:string'),
                                    'availability' => array('availability',
                                                          type=>'xsd:string'),
                                    'price' => array('price',
                                                          type=>'xsd:string')
                                    )
                              );

$server->register(
                  'findArticles',                           // method name
                  array(                                    // input parameters
                        'ArticleQuery'=>array(
                                                'EanCode'=>'xsd:string',
                                                'Quantity'=>'xsd:string'
                                                )                   
                        ),          
                  array('return'=>'tns:Article'),               // output parameters
                  'urn:FindArticlesVanZijl_wsdl',
                  'urn:FindArticlesVanZijl_wsdl#findArticles',
                  'rpc',
                  'encoded',
                  'returns articles from database Van Zijl by given ean-number'
                  );            


//Define the method as a PHP function
function findArticles(????????){
    
    # hier maakt ie connectie met DB
    # en haalt ie artikelen op uit de database, allemaal redelijk te doen
    
    #returning values:
    if ($error){
        return $error;  
    }else{
        $statusCode = 'found';
        $avail = 'yes';

        # return values:
        $article = array(
                        'statusCode'=> $statusCode,
                        'articleNumber'=>$artNumber,
                        'availability'=>$avail,
                        'price'=>$price
                        );
        return $article;
    }//else
}//function

// Use the request to (try to) invoke the service
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';
$server->service($HTTP_RAW_POST_DATA);
?>


Zoals jullie zien staat er in de functie tussen haakjes een aantal vraagtekens.
Wat moet ik hier nu als input neerzetten? Is dat een array 'ArticleQuery' ???

Ik snap dus niet hoe ik een multi-dimensional array kan inlezen. Gaat dat automatisch als er een XML-request komt?
Tevens moet er als response een multi-dimensional array komen met alle artikelen die bij de request-artikelen passen. Dus ik moet een array maken die er als volgt uitziet (volgens mij...):

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$articleResponse = array(
    array(
        'statusCode'=>'1',
        'articleNumber'=>'1234',
        'availability'=>'yes',
        'price'=>'74.00'
    ),
    array(
        'statusCode'=>'1',
        'articleNumber'=>'5678',
        'availability'=>'yes',
        'price'=>'69.00'
    )
    #etc
);


Wordt dit dan ook weer automatisch naar XML geconverteerd als de response gestuurd wordt?

Ik hoop dat jullie mij een beetje kunnen helpen.

Acties:
  • 0 Henk 'm!

Anoniem: 35775

Ten eerste zou ik de standaard SoapServer / Soapclient classes van PHP gebruiken, hierbij kun je een class koppelen als soap server op basis van een wsdl.

Het sturen / ontvangen van XML is daarnaast ook helemaal niet nodig omdat je door middel van Complex-Types gewoon objecten als request en response kan gebruiken die je niet hoeft terug te parsen vanuit XML.

In je WSDL kun je dan een aantal typen definieren zoals:

<xsd:complexType name="ArticleQuery">
<xsd:all>
<xsd:element name="EanCode" type="xsd:integer" />
<xsd:element name="Quantity" type="xsd:integer" />
</xsd:all>
</xsd:complexType>

<xsd:complexType name="FindArticlesRequest">
<xsd:complexContent mixed="false">
<xsd:restriction base="soapenc:Array">
<xsd:attribute wsdl:arrayType="typens:ArticleQuery[]" ref="soapenc:arrayType" />
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>


Het enige dat je dan hoeft te sturen is een array of stdClass object dat de opmaak heeft uit de WSDL.