2015-08-26 21 views

risposta

6

Hai ragione che riempiono lo stesso scopo. Tuttavia, SoapClient ha molte funzionalità per supportare le richieste SOAP integrate e usa Curl da qualche parte.

Come potete vedere nella discussione su SOAP con Curl, il programmatore costruisce la busta SOAP, il SoapClient può farlo per voi. Lo stesso vale per le chiamate al metodo.

Alla fine, è molto più semplice utilizzare SoapClient.

+0

C'è qualche differenza di prestazioni e scenari in cui dovrei usarne uno rispetto all'altro? –

+0

Se sai come creare un'implementazione migliore usando l'arricciatura, immagino che il ricciolo potrebbe essere più veloce. Non creerei la mia implementazione. Abbiamo usato SoapClient in vaste applicazioni senza problemi. –

+1

Sento ancora che ci potrebbe essere una risposta migliore con pro e contro –

-1

prima domanda: Francamente, riempiono la stessa nicchia nel concetto .. Ci potrebbe essere un momento in cui si pensa che è "meglio" di "stampare" il xml, dopo qualche modifica trattandolo come una stringa, piuttosto che costruire mandalo via soap .. curl può fare più di questo, ma quando viene applicato al contesto di ws soap call, semplicemente SOAP tratterà la richiesta come entità "complessa", mentre per arricciare il tuo messaggio è una stringa semplice e semplice ..

Seconda domanda: questo non posso fornire alcuna risposta definitiva .. So che si può fare un po 'di multi-invio con curl, ma non ho mai notato nessun particolare colpo di prestazioni, in più ci sono alcune strutture come zebr a, che avvolge php curl per un (presunto) incremento delle prestazioni, sebbene non li abbia mai provati ... Ma alla fine il ricciolo farà poco più di "inviare" una stringa in caso di arricciatura di sapone, quindi dubito che ci possa essere qualsiasi particolare degrado delle prestazioni ..

+0

Se hai bisogno di una stringa XML puoi sempre usare SoapClient :: __ getLastRequest o SoapClient :: __ getLastResponse – n3xus

4

Ho trascorso innumerevoli ore a trattare con SOAP in PHP. Ora posso affermare di conoscerlo a fondo. :)

Prima domanda: SoapClient e cURL sono intesi per diverso scopo. SoapClient è interamente basato su SOAP, mentre cURL riguarda il trasporto HTTP. Il protocollo di accesso SOAP è un livello superiore rispetto al protocollo di trasporto. SOAP può essere trasmesso da qualsiasi trasporto tu scelga: spesso il documento SOAP (che è semplicemente un documento XML) viene inviato via SMTP (cioè via email) per attraversare i firewall restrittivi. cURL è solo uno strumento per accedere ad alcuni server web da qualche parte.

Seconda domanda: il tempo trascorso in Speedwise per l'esecuzione locale sarà minimo in cURL. Ma questo sarà neutralizzato dalla bassa qualità di tale codice che non seguirà lo standard SOAP ed è destinato a fallire in un modo o nell'altro (e potrebbe anche non farvi sapere). Generalmente in esecuzione la maggior parte del tempo sarà spesa per il trasporto (ad es. Su un server web lento/occupato di rete), quindi non importa molto in che modo si utilizzerà.

Ora vediamo sotto il cofano: l'estensione Soap in PHP è piuttosto incompleta. La ricerca rapida della parola "falso" produce 33 posizioni diverse nel codice. Molti di loro sono php_encoding.c.Sfortunatamente PHP SOAP in alcuni casi non è in grado di produrre SOAP corretto o incapace di capire il SOAP corretto - l'interoperabilità è un problema. La maggior parte dei problemi riguarda PHP e .NET SOAP, ma suppongo che se cercherete di accedere a .NET SOAP con cURL avrete bisogno di un po 'più di poche righe di codice per farlo funzionare. Fortunatamente il SOAP è abbastanza buono in PHP SOAP e funziona con altre implementazioni SOAP. Se vuoi usare SoapHeaders o MustUnderstand essere pronti ad avere un po 'di un incubo. SoapHeaders è relativamente facile da fare con cURL. mustUnderstand sarà piuttosto difficile da fare in cURL.

Il principale vantaggio dell'utilizzo di SoapClient è WSDL (linguaggio di descrizione dei servizi Web). Fondamentalmente si può fare:

$client = new SoapClient("http://webserver.com/service.wsdl"); 
$client->executeRemoteFunction($paramters); 

con l'arricciatura si sarà in grado di farlo perché non ha WSDL parser. Se la fine remota cambierà le sue specifiche l'implementazione di cURL fallirà miseramente e non te lo farà sapere. A questo punto puoi dire: ma se il web server remoto farà cadere silenziosamente executeRemoteFunction() allora non lo saprei neanche! Non è questo il caso: SoapClient con throw Eccezione SoapFault e devi prenderlo e gestirlo oppure il tuo script si fermerà con un messaggio di eccezione non gestito. In ogni caso, lo saprai.

Tuttavia non aspettatevi PHP SOAP per fare alcune cose buone come il controllo dei tipi. Anche se WSDL remoto richiederebbe xs: il PHP SOAP intero lo ignorerebbe e invierà qualsiasi tipo che forniresti in silenzio. Digitare il controllo con cURL? Non può essere fatto perché non c'è supporto WSDL in primo luogo.

Inoltre, mentre si parla di SOAP WSDL, tenere presente che PHP memorizzerà i WSDL per 7 giorni (impostazione predefinita). I rapidi cambiamenti di WSDL durante lo sviluppo ti metteranno nei guai in pochissimo tempo: cancellare la cache WSDL non è sempre facile. Ma d'altra parte è possibile disabilitare completamente la cache WSDL durante lo sviluppo: la velocità diminuirà, ma almeno si sarà in grado di svilupparsi senza avere "Non ho idea del motivo per cui non fa quello che voglio!"

Quindi leggendo alcune cose buone in PHP SOAP ci si potrebbe chiedere se ci siano buoni motivi per usare cURL per SOAP. E la mia risposta è "sì", c'è. Sfortunatamente PHP SOAP non è in grado di creare alcuni tipi di SoapHeader. Quindi, se vai a cose così avanzate, dovrai usare SoapClient per creare un documento SOAP, quindi modificarlo con alcuni strumenti XML (come PHP DOM) e poi inviarlo con cURL. Ma questa è completamente un'altra storia.

Se si inizia con SOAP in PHP, fare un favore e attenersi all'estensione PHP SOAP, non cURL. È un modo più semplice per gestire SOAP, è veloce, l'estensione viene mantenuta (quindi aspettarsi che la sua interoperabilità salga alla fine), comprende WSDL e fornisce una buona segnalazione e gestione degli errori.

+0

Ricordati che puoi disabilitare la cache wsdl di PHP usando ini_set ("soap.wsdl_cache_enabled", 0); –