Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[PHP] SOAP verwacht array met zelfde keys.

Pagina: 1
Acties:
  • 5.984 views

  • Woet
  • Registratie: Mei 2006
  • Laatst online: 16-10 18:09
Voor een SOAP server moeten we het volgende sturen:
code:
1
2
3
   <CwiListTitles xmlns="http://hotelconcepts.com/">
      <PropertyCode>F03</PropertyCode>
   </CwiListTitles>


Met de php SOAP extensie moet je alles als een array sturen:
code:
1
2
$values['PropertyCode'] = "F03";
$this->client->CwiListTitles($values);


Maar ik moet nu de volgende SOAP call sturen:
code:
1
2
3
4
<options>
    <option>HOND</option>
    <option>WIJN</option>
</options>


Met PHP zal dit dan zo moeten worden:
code:
1
2
$values['options']['option'] = "HOND";
$values['options']['option'] = "WIJN";


Indien er 1 optie is gaat het goed, maar bij meerdere wordt alleen de laatste genomen.
Dit komt (natuurlijk) omdat PHP niet een array aankan met dezelfde key, dan wordt deze gewoon overschreven. Heeft iemand enig idee hoe ik toch die array mogelijk maak, of hoe ik een SOAP request direct doe (dus zonder arrays)?

  • Noork
  • Registratie: Juni 2001
  • Niet online
Moet je er geen key achter of voor zetten?

Zoiets?
$values['options']['option'][0] = "HOND";

Onderstaande xml class werkt op die manier. Wellicht kun je die gebruiken om je xml te genereren.
http://keithdevens.com/software/phpxml

  • Woet
  • Registratie: Mei 2006
  • Laatst online: 16-10 18:09
Nee, want dan wordt het:
code:
1
2
3
4
5
6
7
8
9
<options>
    <0>
        <option>HOND</option>
    </0>

    <1>
        <option>WIJN</option>
    </1>
</options>


In plaats van:
code:
1
2
3
4
<options>
    <option>HOND</option>
    <option>WIJN</option>
</options>

  • !null
  • Registratie: Maart 2008
  • Laatst online: 18-11 11:06
Misschien iets proberen in de trant van array( "option" => "iets", "option" => "nogiets" ); ?
al verwacht ik niet dat het werkt eerlijk gezegd.

Ampera-e (60kWh) -> (66kWh)


  • Woet
  • Registratie: Mei 2006
  • Laatst online: 16-10 18:09
GreenSky schreef op vrijdag 18 april 2008 @ 12:22:
Misschien iets proberen in de trant van array( "option" => "iets", "option" => "nogiets" ); ?
al verwacht ik niet dat het werkt eerlijk gezegd.
Werkt niet.

  • flashin
  • Registratie: Augustus 2002
  • Laatst online: 17-12-2023
de xml van je server klopt dan volgens mij ook niet helemaal hoor. Dit gaat je niet lukken zonder dat aan te passen.

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 18-11 23:16

TeeDee

CQB 241

Als ik zo de manual doorlees staan er volgens mij een aantal soortgelijke samples om iets als een array over de schutting te gooien.

Heart..pumps blood.Has nothing to do with emotion! Bored


  • Woet
  • Registratie: Mei 2006
  • Laatst online: 16-10 18:09
flashin schreef op vrijdag 18 april 2008 @ 12:56:
de xml van je server klopt dan volgens mij ook niet helemaal hoor. Dit gaat je niet lukken zonder dat aan te passen.
Dit is niet mijn server, maar een andere partij.
TeeDee schreef op vrijdag 18 april 2008 @ 13:00:
Als ik zo de manual doorlees staan er volgens mij een aantal soortgelijke samples om iets als een array over de schutting te gooien.
Ik heb de handleiding al heel erg uitgespit, maar nog niks gevonden

Verwijderd

Je kunt altijd nog zelf het SOAP bericht opstellen ;)
Maar ja, dan vraag je je misschien af: waarom gebruik ik die hele SoapClient nog...

code:
1
SoapClient->__doRequest()

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 07:40

Creepy

Tactical Espionage Splatterer

Hier staan een voorbeeld dat wel zou moeten werken: http://nl3.php.net/manual/en/ref.soap.php#79457

"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


  • Peter
  • Registratie: Januari 2005
  • Laatst online: 11-11 19:49
Via IRC heb ik Woet ook al gewezen op een gelijk voorbeeld, in mijn eigen tests werkt dat perfect, echter is Woet van mening dat dat niet werkt. Alles wat ik dus nog zou kunnen toevoegen; herinstalleer PHP en/of SOAP.

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Zoiets werkt gewoon. In de TS en in de post van GreenSky worden associatieve arrays gewoon niet begrepen. :> Je kan niet 2x dezelfde key hebben. :P

{signature}


  • !null
  • Registratie: Maart 2008
  • Laatst online: 18-11 11:06
Hee ik probeerde ook maar wat (en ik had geen zin om het te testen :P )

Ampera-e (60kWh) -> (66kWh)


Verwijderd

Woet, dit lijkt me een prima oplossing, al ben ik geen PHP kenner.
Die array met dezelfde keys is de manier waarop o.a. C# arrays of collections naar SOAP serialiseert, en de CWI2 webservice is in C# geschreven.
Er zijn meerdere consumers die in PHP geschreven zijn die succesvol met deze webservice babbelen, dus het is zondermeer mogelijk.

/me is co-auteur van CWI2... :)

  • r0bert
  • Registratie: September 2001
  • Laatst online: 30-07 02:32
Code is vast niet optimaal, maar dit gebruik ik ervoor:
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
<?php 

// Robert de Wilde - wilde825@planet.nl
header ("content-type: text/xml");

ini_set("soap.wsdl_cache_enabled", "0"); 


class SOAPArray
{   private     $__text;
    
    protected $__name;
    
    public      $__childs = Array();        
    public      $__exported;
    
    /* Third+ arguments will become child-elements or attributes  */
    public function __construct($sName, $sText) 
    {   $this->__name = $sName;
        $this->__text = $sText;
        
        $this->__exported = false;
        
        /* If third+ argument(s) are passed, they'll be added as childnodes */
        if (
                (func_num_args() > 2)
            )
        {   $iArg = 1;
        
            /* We require SOAPArray Objects */
            while (@get_class($aChild = func_get_arg(++$iArg)) == 'SOAPArray') 
            {   array_push($this->__childs, $aChild);
            }   
        }
    }
    
    
    public function export()
    {   $aSOAPExport = Array($this->__name => $this->exportArray());
        
        $this->unsetExport();
        
        return $aSOAPExport;
    }
    
    private function unsetExport()
    {   $this->__exported = false;      
        
        foreach ($this->__childs as $oChild)
        {   $oChild->unsetExport();
        }
    }
    
    protected function exportArray()
    {   $aReturnArray = Array();
            // Alles van dezelfde type in een array in een array proppen.
            // Alles waar maar 1 per type van is in ene array
        if ($this->__childs)
        {
            foreach ($this->__childs as $oChild)
            {   if (!$oChild->__exported)
                    $aReturnArray[$oChild->__name] = $this->getChildSameType($oChild->__name, $oChild);
            }
        }
        else
        {   return $this->__text;
        }
        
        return $aReturnArray;
    }
    
    // Call to parent, search in childs
    public function getChildSameType($sType, $oActiveChild)
    {   $aReturnArray = Array();

        foreach ($this->__childs as $oChild)
        {
            if (
                    ($sType == $oChild->__name) && 
                    (!$oChild->__exported)
                )                                                                                                                           //*1   oChild != oActiveChild
            { array_push($aReturnArray, $oChild->exportArray());
                
                $oChild->__exported = true; // Block multiple indexing
            }
        }
        
        if (count($aReturnArray) == 1)                                                                          //*1   > 0
        {   $oActiveChild->unsetExport(); // Free the active child for single indexing
            return $oActiveChild->exportArray();
        }
        else
            return $aReturnArray;
    }
};
    
    

$oSOAP =    
    new SOAPArray('core', null,
    
                        new SOAPArray(
                            'cond', null,
                            
                            new SOAPArray(
                                'cond', 'c == d'
                            ),
                            
                            new SOAPArray(
                                'prop', 'naam'
                            )
                        ),
                        new SOAPArray(
                            'cond', 'a == b'
                        ),
                        
                        new SOAPArray(
                            'act', 'getNodes'
                        ),
                        
                        new SOAPArray(
                            'name','facturen'
                        ),
                        
                        new SOAPArray(
                            'select', null,
                            
                            new SOAPArray(
                                'prop', 'relatieid'
                            ),
                            new SOAPArray(
                                'prop', 'naam'      
                            ),
                            new SOAPArray(
                                'prop', 'plaats'        
                            )
                        ),
                        
                        new SOAPArray(
                            'param', null,
                            
                            new SOAPArray(
                                'name', 'sort'                  
                            )
                        )   
            );

//print_r($oSOAP->export());


# HelloClientWsdl.php
# Copyright (c) 2005 by Dr. Herong Yang
#


   $client = new SoapClient("http://localhost/hello.wsdl",
                                                        Array(
                                                            'soap_version' => SOAP_1_2,
                                                            'trace' => 1,
                                                            'features' => SOAP_SINGLE_ELEMENT_ARRAYS
                                                        )
                                                );


        
   $return = $client->__soapCall("getNodes", 
                                                                        $oSOAP->export()
                                                            );

        echo $client->__getLastRequest();

Als in http://sovenewmedia.nl/framework/wsdl/client.phps

  • Woet
  • Registratie: Mei 2006
  • Laatst online: 16-10 18:09
Dit werkt echt niet, ik krijg nu namelijk:
code:
1
Fatal error: Uncaught SoapFault exception: [Client] SOAP-ERROR: Encoding: object hasn't 'BaseAmount' property in /home/booking/_system/soap.php:377


Omdat het in dit formaat wordt verstuurd:
code:
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
            [Extras] => Array
                (
                    [Extra] => Array
                        (
                            [0] => Array
                                (
                                    [0] => Array
                                        (
                                            [Name] => BLOEMEN
                                            [BaseAmount] => 15.00
                                            [StartDate] => 2008-04-30
                                            [EndDate] => 2008-05-01
                                            [AdultAmount] => 0
                                            [ChildAmount] => 0
                                            [InfantAmount] => 0
                                            [Description] => Boeket bloemen
                                            [ChargeOnce] => 
                                        )

                                    [1] => Array
                                        (
                                            [Name] => FIETS
                                            [BaseAmount] => 6.50
                                            [StartDate] => 2008-04-30
                                            [EndDate] => 2008-04-30
                                            [AdultAmount] => 0
                                            [ChildAmount] => 0
                                            [InfantAmount] => 0
                                            [Description] => Fiets verhuur
                                            [ChargeOnce] => 
                                        )

                                )

                        )

                )

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Er komen nu hele lappen code en array dumps langs, maar snap je uberhaupt wel wat bijvoorbeeld het volgende statement doet?
PHP:
1
$values['options']['option'] = array('HOND', 'WIJN');

Want op een dergelijke manier kan je dit gewoon _wel_ voor elkaar krijgen. Als dat niet lukt, moet je niet enkel "werkt niet" zeggen, want met zulke gebrekkige feedback kan niemand je verder helpen.

{signature}


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 07:40

Creepy

Tactical Espionage Splatterer

Wat Voutloos zegt dus.

Daarnaast wordt het nu echt een helpdesk topic. Melden "het werkt niet" met alleen een code dump is hier niet de bedoeling. Je code proberen te fixen, debuggen, test etc. is iets wat je in eerste instantie toch echt zelf zal moeten doen. Zelf een co-auteur van de gebruikte service meld dat het gewoon zou moeten werken dus daar ligt het ook niet.

De foutmelding die je nu krijgt is van een heel andere orde. Blijkbaar geef je nu zelf verkeerde zaken mee waardoor het niet werkt en dat krijg je ook netjes terug als foutmelding. Ga nu zelf eens rustug bekijken wat er mis gaat en probeer dat nu eerst zelf eens op te lossen voordat je hier weer zaken direct dumpt in de hoop dat wij het voor je gaan fixen want dat is echt niet de bedoeling hier zoals prima staat beschreven in Programming Beleid - De Quickstart

[ Voor 7% gewijzigd door Creepy op 21-04-2008 11:51 ]

"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

Pagina: 1

Dit topic is gesloten.