PHP
SOAP Client
Ricerca…
Sintassi
- __getFunctions () // Restituisce l'array di funzioni per il servizio (solo modalità WSDL)
- __getTypes () // Restituisce l'array di tipi per il servizio (solo modalità WSDL)
- __getLastRequest () // Restituisce XML dall'ultima richiesta (richiede l'opzione di
trace
) - __getLastRequestHeaders () // Restituisce le intestazioni dall'ultima richiesta (richiede l'opzione di
trace
) - __getLastResponse () // Restituisce XML dall'ultima risposta (richiede l'opzione di
trace
) - __getLastResponseHeaders () // Restituisce le intestazioni dall'ultima risposta (richiede l'opzione di
trace
)
Parametri
Parametro | Dettagli |
---|---|
$ wsdl | URI di WSDL o NULL se si utilizza la modalità non WSDL |
$ options | Matrice di opzioni per SoapClient. La modalità non WSDL richiede la location e uri da impostare, tutte le altre opzioni sono opzionali. Vedere la tabella sotto per i valori possibili. |
Osservazioni
La classe SoapClient
è dotata di un metodo __call
. Questo non deve essere chiamato direttamente. Invece questo ti permette di fare:
$soap->requestInfo(['a', 'b', 'c']);
Questo chiamerà il metodo SOAP requestInfo
.
Tabella dei possibili valori delle $options
( matrice di coppie chiave / valore ):
Opzione | Dettagli |
---|---|
Posizione | URL del server SOAP. Richiesto in modalità non WSDL. Può essere utilizzato in modalità WSDL per sovrascrivere l'URL. |
uri | Target namespace del servizio SOAP. Richiesto in modalità non WSDL. |
stile | I valori possibili sono SOAP_RPC o SOAP_DOCUMENT . Valido solo in modalità non WSDL. |
uso | I valori possibili sono SOAP_ENCODED o SOAP_LITERAL . Valido solo in modalità non WSDL. |
soap_version | I valori possibili sono SOAP_1_1 ( predefinito ) o SOAP_1_2 . |
autenticazione | Abilita autenticazione HTTP. I valori possibili sono SOAP_AUTHENTICATION_BASIC ( predefinito ) o SOAP_AUTHENTICATION_DIGEST . |
accesso | Nome utente per l'autenticazione HTTP |
parola d'ordine | Password per l'autenticazione HTTP |
proxy_host | URL del server proxy |
porta proxy | Porta del server proxy |
proxy_login | Nome utente per il proxy |
proxy_password | Password per il proxy |
local_cert | Percorso per il certificato client HTTPS (per l'autenticazione) |
frase d'accesso | Passphrase per il certificato del client HTTPS |
compressione | Comprimi richiesta / risposta. Il valore è una maschera di bit di SOAP_COMPRESSION_ACCEPT con SOAP_COMPRESSION_GZIP o SOAP_COMPRESSION_DEFLATE . Ad esempio: SOAP_COMPRESSION_ACCEPT \| SOAP_COMPRESSION_GZIP . |
codifica | Codifica dei caratteri interni (TODO: possibili valori) |
traccia | Boolean , il valore predefinito è FALSE . Abilita la traccia delle richieste in modo che i guasti possano essere retrocessi. Consente l'uso di __getLastRequest() , __getLastRequestHeaders() , __getLastResponse() e __getLastResponseHeaders() . |
classmap | Mappare i tipi WSDL alle classi PHP. Il valore dovrebbe essere un array con tipi WSDL come chiavi e nomi di classi PHP come valori. |
eccezioni | Valore booleano . Dovrebbero esserci errori di SOAP (di tipo `SoapFault). |
connesione finita | Timeout (in secondi) per la connessione al servizio SOAP. |
typemap | Matrice di tipi di mappature. La matrice deve essere coppia chiave / valore con i seguenti tasti: type_name , type_ns (URI dello spazio dei nomi), from_xml (callback che accetta un parametro stringa) e to_xml (callback che accetta un parametro oggetto). |
cache_wsdl | Come (se necessario) dovrebbe essere memorizzato il file WSDL. I valori possibili sono WSDL_CACHE_NONE , WSDL_CACHE_DISK , WSDL_CACHE_MEMORY o WSDL_CACHE_BOTH . |
user_agent | Stringa da utilizzare nell'intestazione User-Agent . |
stream_context | Una risorsa per un contesto. |
Caratteristiche | Maschera di bit di SOAP_SINGLE_ELEMENT_ARRAYS , SOAP_USE_XSI_ARRAY_TYPE , SOAP_WAIT_ONE_WAY_CALLS . |
KEEP_ALIVE | ( Versione PHP> = 5.4 solo ) Valore booleano . Invia una Connection: Keep-Alive intestazione Connection: Keep-Alive ( TRUE ) o Connection: Close header ( FALSE ). |
ssl_method | ( Versione PHP> = solo 5.5 ) Quale versione SSL / TLS usare. I valori possibili sono SOAP_SSL_METHOD_TLS , SOAP_SSL_METHOD_SSLv2 , SOAP_SSL_METHOD_SSLv3 o SOAP_SSL_METHOD_SSLv23 . |
Problema con PHP a 32 bit : in PHP a 32 bit, stringhe numeriche superiori a 32 bit che vengono automaticamente convertite in numero intero da
xs:long
risulterà il raggiungimento del limite di 32 bit, gettandolo a2147483647
. Per ovviare a questo, lanciare le stringhe su float prima di passarle a__soapCall()
.
Modalità WSDL
Innanzitutto, crea un nuovo oggetto SoapClient
, passando l'URL al file WSDL e, facoltativamente, una serie di opzioni.
// Create a new client object using a WSDL URL
$soap = new SoapClient('https://example.com/soap.wsdl', [
# This array and its values are optional
'soap_version' => SOAP_1_2,
'compression' => SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_GZIP,
'cache_wsdl' => WSDL_CACHE_BOTH,
# Helps with debugging
'trace' => TRUE,
'exceptions' => TRUE
]);
Quindi utilizzare l'oggetto $soap
per chiamare i metodi SOAP.
$result = $soap->requestData(['a', 'b', 'c']);
Modalità non WSDL
Questo è simile alla modalità WSDL, tranne che passiamo NULL
come file WSDL e assicuratevi di impostare la location
e le opzioni uri
.
$soap = new SoapClient(NULL, [
'location' => 'https://example.com/soap/endpoint',
'uri' => 'namespace'
]);
Classmaps
Quando si crea un client SOAP in PHP, è anche possibile impostare una chiave di classmap
nell'array di configurazione. Questa classmap
definisce quali tipi definiti nel WSDL devono essere mappati su classi effettive, invece che su StdClass
predefinito. Il motivo per cui dovresti farlo è che puoi ottenere il completamento automatico dei campi e delle chiamate ai metodi su queste classi, invece di dover indovinare quali campi sono impostati sul normale StdClass
.
class MyAddress {
public $country;
public $city;
public $full_name;
public $postal_code; // or zip_code
public $house_number;
}
class MyBook {
public $name;
public $author;
// The classmap also allows us to add useful functions to the objects
// that are returned from the SOAP operations.
public function getShortDescription() {
return "{$this->name}, written by {$this->author}";
}
}
$soap_client = new SoapClient($link_to_wsdl, [
// Other parameters
"classmap" => [
"Address" => MyAddress::class, // ::class simple returns class as string
"Book" => MyBook::class,
]
]);
Dopo aver configurato la mappa di classe, ogni volta che si esegue una determinata operazione che restituisce un tipo Address
o Book
, SoapClient crea un'istanza di quella classe, riempie i campi con i dati e li restituisce dalla chiamata all'operazione.
// Lets assume 'getAddress(1234)' returns an Address by ID in the database
$address = $soap_client->getAddress(1234);
// $address is now of type MyAddress due to the classmap
echo $address->country;
// Lets assume the same for 'getBook(1234)'
$book = $soap_client->getBook(124);
// We can not use other functions defined on the MyBook class
echo $book->getShortDescription();
// Any type defined in the WSDL that is not defined in the classmap
// will become a regular StdClass object
$author = $soap_client->getAuthor(1234);
// No classmap for Author type, $author is regular StdClass.
// We can still access fields, but no auto-completion and no custom functions
// to define for the objects.
echo $author->name;
Tracciare la richiesta e la risposta SOAP
A volte vogliamo vedere cosa viene inviato e ricevuto nella richiesta SOAP. I seguenti metodi restituiranno l'XML nella richiesta e nella risposta:
SoapClient::__getLastRequest()
SoapClient::__getLastRequestHeaders()
SoapClient::__getLastResponse()
SoapClient::__getLastResponseHeaders()
Ad esempio, supponiamo di avere una costante ENVIRONMENT
e quando il valore di questa costante è impostato su DEVELOPMENT
vogliamo getAddress
tutte le informazioni quando la chiamata a getAddress
genera un errore. Una soluzione potrebbe essere:
try {
$address = $soap_client->getAddress(1234);
} catch (SoapFault $e) {
if (ENVIRONMENT === 'DEVELOPMENT') {
var_dump(
$soap_client->__getLastRequestHeaders()
$soap_client->__getLastRequest(),
$soap_client->__getLastResponseHeaders(),
$soap_client->__getLastResponse()
);
}
...
}