[WSDL] complexTypes definieren

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
ik ben met het ontwikkelen van een soap webservice bezig en zou graag jullie mening willen weten over het volgende:

stel ik heb een functie in de webservice om orders op te halen. De input is dan een lijst met orders, de output een lijst met orders voorzien van extra informatie.

dus bijv (in werkelijkheid is het wat ingewikkelder, maar voor mijn vraag volstaat onderstaande voorbeeld):

XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<soap:Envelope>
<soap:Body>
    <GetOrders>
        <order>
            <ordernr>12345</ordernr>
        </order>
        <order>
            <ordernr>67890</ordernr>
        </order>
        <order>
            <ordernr>54321</ordernr>
        </order>
    </GetOrders>
</soap:Body>
</soap:Envelope>


en het resultaat is dan bijvoorbeeld:
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<soap:Envelope>
<soap:Body>
    <GetOrdersResponse>
        <order>
            <ordernr>12345</ordernr>
            <article>Fiets</article>
            <price>100.00</price>
        </order>
        <order>
            <ordernr>67890</ordernr>
            <article>Auto</article>
            <price>1000.00</price>
        </order>
        <order>
            <ordernr>54321</ordernr>
            <article>Bus</article>
            <price>10000.00</price>
        </order>
    </GetOrdersResponse>
</soap:Body>
</soap:Envelope>


Hoe zouden jullie bijv. het "type order" in de WSDL definieren?

het kan bijv zo (even alleen de belangrijke wsdl items weergegeven:

XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<wsdl:types>
    <xsd:schema>
        <xsd:complexType name="order">
            <xsd:sequence>
                <xsd:complexType name="ordernr" type="xsd:string" minOccurs="1" maxOccurs="1" />
                <xsd:complexType name="article" type="xsd:string" minOccurs="0" maxOccurs="1" />
                <xsd:complexType name="price" type="xsd:double" minOccurs="0" maxOccurs="1" />
            </xsd:sequence>
        </xsd:complexType>
        <xsd:complexType name="orders">
            <xsd:sequence>
                <xsd:complexType name="order" type="tns:order" minOccurs="1" />
            </xsd:sequence>
        </xsd:complexType>
    </xsd:schema>
</wsdl:types>
<wsdl:message name="GetOrderRequest">
    <wsdl:part name="orders" type="tns:orders">
</wsdl:message>
<wsdl:message name="GetOrderResponse">
    <wsdl:part name="orders" type="tns:orders">
</wsdl:message>


of bijv. zo:
XML:
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
<wsdl:types>
    <xsd:schema>
        <xsd:complexType name="orderAsResponse">
            <xsd:sequence>
                <xsd:complexType name="ordernr" type="xsd:string" minOccurs="1" maxOccurs="1" />
                <xsd:complexType name="article" type="xsd:string" minOccurs="0" maxOccurs="1" />
                <xsd:complexType name="price" type="xsd:double" minOccurs="0" maxOccurs="1" />
            </xsd:sequence>
        </xsd:complexType>
        <xsd:complexType name="ordersAsResponse">
            <xsd:sequence>
                <xsd:complexType name="orderAsResponse" type="tns:orderAsResponse" minOccurs="1" />
            </xsd:sequence>
        </xsd:complexType>
        <xsd:complexType name="orderAsRequest">
            <xsd:sequence>
                <xsd:complexType name="ordernr" type="xsd:string" minOccurs="1" maxOccurs="1" />
            </xsd:sequence>
        </xsd:complexType>
        <xsd:complexType name="ordersAsRequest">
            <xsd:sequence>
                <xsd:complexType name="orderAsRequest" type="tns:orderAsRequest" minOccurs="1" />
            </xsd:sequence>
        </xsd:complexType>
    </xsd:schema>
</wsdl:types>
<wsdl:message name="GetOrderRequest">
    <wsdl:part name="orders" type="tns:ordersAsRequest">
</wsdl:message>
<wsdl:message name="GetOrderResponse">
    <wsdl:part name="orders" type="tns:ordersAsResponse">
</wsdl:message>


m.a.w. in het eerste geval is het technische gezien volgens het schema dat bij de request ook een article of price wordt meegegeven (niet dat daar iets mee gedaan wordt, maar het voldoet wel aan het schema).
in het tweede voorbeeld zijn voldoet zowel de request als de response aan het schema en is het niet mogelijk een article of price in de request mee te geven.

De tweede request is dus preciezer in de definitie, maar geeft een veel rommeligere WSDL in mijn ogen.

Hoe zouden jullie dit aanpakken? Of zie ik wellicht nog iets over het hoofd?

(let wel, mijn werkelijk situatie is veel complexer... daar zou het leiden tot een ontzettende hoeveelheid wsdl:types die allemaal net even iets anders zijn.

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 11:48

Creepy

Tactical Espionage Splatterer

Ik zou de keuze niet laten afhangen van hoe de WSDL eruit ziet, maar hoe je er mee om wilt gaan in je eigen code. Bij Getorders geef je nu een lijst van orders op, die elk een ordernr hebben. Maar ik zou bij getOrder een lijst van ordernr's verwachten.

We laten hier dan ook de WSDL genereren aan de hand van de code. Een call die getOrders heet en die als parameter een lijst van orders krijgt, i.p.v een lijst met id's, valt dan direct op...

[ Voor 27% gewijzigd door Creepy op 04-03-2016 16:18 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • ChaZy
  • Registratie: September 2004
  • Laatst online: 02-09 21:34
In dit geval ben ik het, als ik hem goed begrijp, met Creepy eens dat je misschien liever een lijst van id's als parameter zou verwachten ipv een order class met alleen een ordernr.

Als je toch een de order als parameter zou willen gebruiken zou ik ervoor kiezen om een verschil te maken tussen het request- en response class zodat je niet de indruk wekt dat bijvoorbeeld de prijs van de order ook een parameter kan zijn.

In dit geval zou ik dan inderdaad ook voor een request en response class gaan. Persoonlijk heb ik de voorkeur om een request class in jou geval: "orderParameters" te noemen en je response dan gewoon "order" te noemen.

Acties:
  • 0 Henk 'm!

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
Ok, dank voor jullie input... Ik heb mijn voorbeeld wat gesimplificeerd, in werkelijkheid is de request niet alleen een lijstje van id's.

ik had al zo'n vermoeden dat een aparte request en response class de "most suitable" oplossing zou zijn... ik ga daar mee aan de slag... mocht iemand nog andere tips hebben dan hou ik me aanbevolen uiteraard :)

Acties:
  • 0 Henk 'm!

  • DJMaze
  • Registratie: Juni 2002
  • Niet online
P.O. Box schreef op vrijdag 04 maart 2016 @ 16:39:
ik ga daar mee aan de slag... mocht iemand nog andere tips hebben dan hou ik me aanbevolen uiteraard :)
code:
1
2
<xsd:complexType name="ordernr" type="xsd:string" minOccurs="1" maxOccurs="1" />
<xsd:complexType name="price" type="xsd:double" minOccurs="0" maxOccurs="1" />

Gebruik eens xsd:unsignedLong/xsd:unsignedInt en xsd:decimal

Want waarom zou je voor "ordernr" en "price" een waarde als "ABFF00" toestaan?

En met http://www.w3.org/2001/XMLSchema-instance kan je ook nil/null waardes gebruiken.
code:
1
xsi:nil="true"

[ Voor 10% gewijzigd door DJMaze op 04-03-2016 23:57 ]

Maak je niet druk, dat doet de compressor maar


Acties:
  • 0 Henk 'm!

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
DJMaze schreef op vrijdag 04 maart 2016 @ 23:52:
[...]

code:
1
2
<xsd:complexType name="ordernr" type="xsd:string" minOccurs="1" maxOccurs="1" />
<xsd:complexType name="price" type="xsd:double" minOccurs="0" maxOccurs="1" />

Gebruik eens xsd:unsignedLong/xsd:unsignedInt en xsd:decimal

Want waarom zou je voor "ordernr" en "price" een waarde als "ABFF00" toestaan?

En met http://www.w3.org/2001/XMLSchema-instance kan je ook nil/null waardes gebruiken.
code:
1
xsi:nil="true"
dank voor de tip! je laatste opmerking begrijp ik niet. Zie je het nu juist positief of negatief dat nil-waarden gebruikt kunnen worden?

Acties:
  • 0 Henk 'm!

  • DJMaze
  • Registratie: Juni 2002
  • Niet online
P.O. Box schreef op zaterdag 05 maart 2016 @ 14:04:
Zie je het nu juist positief of negatief dat nil-waarden gebruikt kunnen worden?
XML kent standaard geen NULL/NIL.

De waarde van <ordernr/> is een lege string.
De waarde van <ordernr></ordernr> is een lege string.

De waarde van <ordernr xsi:nil="true"/> is NULL
Als je dus ook NULL waardes nodig hebt, is dat dus een tip.

Het blijft natuurlijk discutabel of je NULL überhaupt moet willen gebruiken.
Echter... ik heb een database data exporteer systeem gemaakt en dan kan een kolom ook NULL hebben.
Hier is de schema.xsd:
https://bitbucket.org/djm...eviewer=file-view-default

Maak je niet druk, dat doet de compressor maar


Acties:
  • 0 Henk 'm!

  • raptorix
  • Registratie: Februari 2000
  • Laatst online: 17-02-2022
Null kan wel degelijk relevant zijn, bijvoorbeeld in een tristate boolean.
Pagina: 1