Toon posts:

PHP Webservice multi-dimensional request en response

Pagina: 1
Acties:

Onderwerpen


  • MiniDutch
  • Registratie: juli 2001
  • Laatst online: 06-12-2012
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.

  • thioz
  • Registratie: september 2001
  • Laatst online: 06-11-2018
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.

I feel like i've been taking crazy pills



Nintendo Switch (OLED model) Apple iPhone 13 LG G1 Google Pixel 6 Call of Duty: Vanguard Samsung Galaxy S21 5G Apple iPad Pro (2021) 11" Wi-Fi, 8GB ram Nintendo Switch Lite

Tweakers vormt samen met Hardware Info, AutoTrack, Gaspedaal.nl, Nationale Vacaturebank, Intermediair en Independer DPG Online Services B.V.
Alle rechten voorbehouden © 1998 - 2021 Hosting door True

Tweakers maakt gebruik van cookies

Bij het bezoeken van het forum plaatst Tweakers alleen functionele en analytische cookies voor optimalisatie en analyse om de website-ervaring te verbeteren. Op het forum worden geen trackingcookies geplaatst. Voor het bekijken van video's en grafieken van derden vragen we je toestemming, we gebruiken daarvoor externe tooling die mogelijk cookies kunnen plaatsen.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Forum cookie-instellingen

Bekijk de onderstaande instellingen en maak je keuze. Meer informatie vind je in ons cookiebeleid.

Functionele en analytische cookies

Deze cookies helpen de website zijn functies uit te voeren en zijn verplicht. Meer details

janee

    Cookies van derden

    Deze cookies kunnen geplaatst worden door derde partijen via ingesloten content en om de gebruikerservaring van de website te verbeteren. Meer details

    janee