Ricerca…


Sintassi

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 a 2147483647 . 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()
        );
    }
    ...
}


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow