Szukaj…


Składnia

Parametry

Parametr Detale
$ wsdl URI WSDL lub NULL jeśli używasz trybu innego niż WSDL
Opcje $ Tablica opcji dla SoapClient. Tryb inny niż WSDL wymaga ustawienia location i uri , wszystkie pozostałe opcje są opcjonalne. Możliwe wartości znajdują się w tabeli poniżej.

Uwagi

Klasa SoapClient jest wyposażona w metodę __call . Nie można tego nazwać bezpośrednio. Zamiast tego pozwala to na:

$soap->requestInfo(['a', 'b', 'c']);

Spowoduje to wywołanie metody SOAP requestInfo .


Tabela możliwych wartości $options ( tablica par klucz / wartość ):

Opcja Detale
Lokalizacja URL serwera SOAP. Wymagane w trybie innym niż WSDL. Może być używany w trybie WSDL w celu zastąpienia adresu URL.
uri Docelowa przestrzeń nazw usługi SOAP. Wymagane w trybie innym niż WSDL.
styl Możliwe wartości to SOAP_RPC lub SOAP_DOCUMENT . Obowiązuje tylko w trybie innym niż WSDL.
posługiwać się Możliwe wartości to SOAP_ENCODED lub SOAP_LITERAL . Obowiązuje tylko w trybie innym niż WSDL.
wersja_mydła Możliwe wartości to SOAP_1_1 ( domyślnie ) lub SOAP_1_2 .
poświadczenie Włącz uwierzytelnianie HTTP. Możliwe wartości to SOAP_AUTHENTICATION_BASIC ( domyślnie ) lub SOAP_AUTHENTICATION_DIGEST .
Zaloguj sie Nazwa użytkownika do uwierzytelnienia HTTP
hasło Hasło do uwierzytelnienia HTTP
proxy_host URL serwera proxy
Port proxy Port serwera proxy
proxy_login Nazwa użytkownika dla proxy
hasło_ proxy Hasło do serwera proxy
local_cert Ścieżka do certyfikatu klienta HTTPS (do uwierzytelnienia)
hasło Hasło do certyfikatu klienta HTTPS
kompresja Kompresuj żądanie / odpowiedź. Wartość jest SOAP_COMPRESSION_ACCEPT z SOAP_COMPRESSION_GZIP lub SOAP_COMPRESSION_DEFLATE . Na przykład: SOAP_COMPRESSION_ACCEPT \| SOAP_COMPRESSION_GZIP .
kodowanie Wewnętrzne kodowanie znaków (TODO: możliwe wartości)
ślad Boolean , domyślnie FALSE . Umożliwia śledzenie żądań, aby można było śledzić błędy. Umożliwia używanie __getLastRequest() , __getLastRequestHeaders() , __getLastResponse() i __getLastResponseHeaders() .
mapa klas Odwzoruj typy WSDL na klasy PHP. Wartość powinna być tablicą z typami WSDL jako kluczami i nazwami klas PHP jako wartości.
wyjątki Wartość logiczna . Powinny błędy SOAP (wyjątki typu `SoapFault).
czas połączenia minął Limit czasu (w sekundach) dla połączenia z usługą SOAP.
mapa strony Tablica odwzorowań typów. Tablica powinna być kluczowe pary wartości / z następujących klawiszy: type_name , type_ns (nazw URI), from_xml (zwrotna przyjmowanie parametr jeden ciąg) i to_xml (parametr callback przyjmując jeden obiekt).
cache_wsdl Jak (jeśli w ogóle) powinien być buforowany plik WSDL. Możliwe wartości to WSDL_CACHE_NONE , WSDL_CACHE_DISK , WSDL_CACHE_MEMORY lub WSDL_CACHE_BOTH .
agent użytkownika Ciąg znaków do użycia w nagłówku User-Agent .
stream_context Zasób dla kontekstu.
cechy Maska bitów SOAP_SINGLE_ELEMENT_ARRAYS , SOAP_USE_XSI_ARRAY_TYPE , SOAP_WAIT_ONE_WAY_CALLS .
utrzymać przy życiu ( Tylko wersja PHP> = 5.4 ) Wartość logiczna . Wyślij albo Connection: Keep-Alive header ( TRUE ), albo Connection: Close header ( FALSE ).
ssl_method ( Tylko wersja PHP> = 5.5 ) Której wersji protokołu SSL / TLS użyć. Możliwe wartości to SOAP_SSL_METHOD_TLS , SOAP_SSL_METHOD_SSLv2 , SOAP_SSL_METHOD_SSLv3 lub SOAP_SSL_METHOD_SSLv23 .

Problem z 32-bitowym PHP : w 32-bitowym PHP ciągi liczbowe większe niż 32 bity, które są automatycznie rzutowane na liczbę całkowitą przez xs:long powodują, że osiągną limit 32 bitów, przesyłając go do 2147483647 . Aby obejść ten problem, należy rzutować ciągi znaków na zmiennoprzecinkowe przed przekazaniem ich do __soapCall() .

Tryb WSDL

Najpierw utwórz nowy obiekt SoapClient , przekazując adres URL do pliku WSDL i opcjonalnie tablicę opcji.

// 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
]);

Następnie użyj obiektu $soap do wywołania metod SOAP.

$result = $soap->requestData(['a', 'b', 'c']);

Tryb inny niż WSDL

Jest to podobne do trybu WSDL, z tym wyjątkiem, że przekazujemy NULL jako plik WSDL i upewnij się, że ustawiłeś opcje location i uri .

$soap = new SoapClient(NULL, [
    'location' => 'https://example.com/soap/endpoint',
    'uri' => 'namespace'
]);

Mapy klas

Podczas tworzenia klienta SOAP w PHP można również ustawić klucz classmap w tablicy konfiguracji. Ta classmap określa, które typy zdefiniowane w WSDL powinny być mapowane na rzeczywiste klasy, zamiast domyślnej StdClass . Powodem, dla którego chcesz to zrobić, jest to, że możesz uzyskać automatyczne uzupełnianie pól i wywołań metod w tych klasach, zamiast zgadywać, które pola są ustawione na zwykłym 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,
    ]
]);

Po skonfigurowaniu mapy klas, za każdym razem, gdy wykonasz określoną operację, która zwraca typ Address lub Book , SoapClient utworzy instancję tej klasy, wypełni pola danymi i zwróci je z wywołania operacji.

// 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;

Śledzenie żądania i odpowiedzi SOAP

Czasami chcemy spojrzeć na to, co jest wysyłane i odbierane w żądaniu SOAP. Następujące metody zwrócą XML w żądaniu i odpowiedzi:

SoapClient::__getLastRequest()
SoapClient::__getLastRequestHeaders()
SoapClient::__getLastResponse()
SoapClient::__getLastResponseHeaders()

Załóżmy na przykład, że mamy stałą ENVIRONMENT a gdy wartość tej stałej jest ustawiona na DEVELOPMENT , chcemy echo wszystkich informacji, gdy wywołanie getAddress zgłosi błąd. Jednym z rozwiązań może być:

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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow