Two notes about the steam_context option:
1- In the example of the documentation, it says:
<?php
$client = new SoapClient("some.wsdl", ['context' => $context]);
?>
This is wrong. As it is stated in the parameters list, it must be "stream_context" and NOT "context".
2- The HTTP Context manual here: https://www.php.net/manual/en/context.http.php
It says header can either be of type array or string. This is also wrong. It may not necessarily be optional because it might depend on your PHP compile time configuration.
If your instance is compiled --with-curlwrappers option, you should use array type for header in the HTTP context and if not; you should use a string separated by new line (\n) for the header. I am not sure if SoapClient respects curl_wrappers option because although it is enabled in my instance and although I am using arrays for the headers to create HTTP context for non-Soap operations; SoapClient required me to use a string. It otherwise just dropped the stream_context altogether.
So with SoapClient, you better use a string for the HTTP header like:
<?php
$context = stream_context_create(array(
'http' => array(
'user_agent' => 'My App',
'header' =>
"Custom-Header: Value\n" .
"Another Header: Surprise"
)
));
$client = new SoapClient('some.wsdl', ['stream_context' => $context]);
?>SoapClient::__construct
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
SoapClient::__construct
Референца за `soapclient.construct.php` со подобрена типографија и навигација.
SoapClient::__construct
класата mysqli_driver
SoapClient::__construct — Конструктор на SoapClient
= NULL
Креира SoapClient објект за поврзување со SOAP услуга.
Параметри
wsdl-
URI на WSDL датотека што ја опишува услугата, која се користи за автоматско конфигурирање на клиентот. Ако не е обезбедена, клиентот ќе работи во режим без WSDL.
Забелешка:
Стандардно, WSDL-датотеката ќе биде кеширана за подобри перформанси. За да го оневозможите или конфигурирате ова кеширање, видете SOAP Опции за конфигурирање Пример #4 Споредување на вратената вредност на include
cache_wsdloption. options-
Асоцијативен низ што специфицира дополнителни опции за SOAP клиентот. Ако
wsdlе обезбедено, ова е опционално; инаку, баремlocationandurlе шифриран (како што треба да биде),-
locationstring -
URL-то на SOAP серверот на кој ќе се испрати барањето.
Задолжително ако
wsdlпараметарот не е обезбеден. Ако иwsdlпараметарот иlocationопцијата се обезбедени,locationопцијата ќе ги надвладее сите локации специфицирани во WSDL-датотеката. -
uristring -
Целниот простор на имиња на SOAP услугата.
Задолжително ако
wsdlпараметарот не е обезбеден; инаку се игнорира. -
styleint -
Специфицира стил на поврзување што ќе се користи за овој клиент, користејќи ги константите
SOAP_RPCandSOAP_DOCUMENT.SOAP_RPCозначува RPC-стил на поврзување, каде што телото на SOAP барањето содржи стандардно кодирање на повик на функција.SOAP_DOCUMENTозначува документ-стил на поврзување, каде што телото на SOAP барањето содржи XML документ со значење дефинирано од услугата.Ако
wsdlако се обезбеди параметарот, оваа опција се игнорира и стилот се чита од WSDL-датотеката.Ако ниту оваа опција ниту
wsdlпараметарот е обезбеден, се користи RPC-стил. -
useint -
Го специфицира стилот на кодирање што треба да се користи за овој клиент, користејќи ги константите
SOAP_ENCODEDorSOAP_LITERAL.SOAP_ENCODEDго означува кодирањето користејќи ги типовите дефинирани во спецификацијата на SOAP.SOAP_LITERALго означува кодирањето користејќи шема дефинирана од услугата.Ако
wsdlако се обезбеди параметарот, оваа опција се игнорира и кодирањето се чита од WSDL-датотеката.Ако ниту оваа опција ниту
wsdlако се обезбеди параметарот, се користи „encoded“ стилот. -
soap_versionint -
Го специфицира верзијата на SOAP протоколот што треба да се користи:
SOAP_1_1за SOAP 1.1, илиSOAP_1_2за SOAP 1.2.Ако е изоставено, се користи SOAP 1.1.
-
authenticationint -
Го специфицира методот за автентикација при користење на HTTP автентикација во барањата. Вредноста може да биде или
SOAP_AUTHENTICATION_BASICorSOAP_AUTHENTICATION_DIGEST.Ако е изоставено, и
loginпараметарот е обезбеден, се користи Basic Authentication. -
loginstring -
Корисничко име што треба да се користи со HTTP Basic или Digest Authentication.
-
passwordstring -
Лозинка што треба да се користи со HTTP Basic или Digest Authentication.
Не треба да се меша со
passphrase, што се користи со автентикација на клиентски сертификат за HTTPS. -
local_certstring -
Патека до клиентски сертификат за употреба со автентикација на HTTPS. Мора да биде PEM enkodirana datoteka што ги содржи сертификатот и приватниот клуч.
Датотеката може да вклучува и синџир на издавачи, кои мора да доаѓаат по клиентскиот сертификат.
Може да се постави и преку
stream_context, што исто така поддржува специфицирање на посебна датотека со приватен клуч. -
passphrasestring -
Лозинка за клиентскиот сертификат наведен во
local_certoption.Не треба да се меша со
password, што се користи за Basic или Digest автентикација.Може да се постави и преку
stream_context. -
proxy_hoststring -
Име на домаќин што ќе се користи како прокси сервер за HTTP барања.
На
proxy_portопцијата мора исто така да биде специфицирана. -
proxy_portint -
TCP порта што ќе се користи при поврзување со прокси серверот наведен во
proxy_host. -
proxy_loginstring -
Изборно корисничко име за автентикација со прокси серверот наведен во
proxy_host, користејќи HTTP Basic автентикација. -
proxy_passwordstring -
Изборна лозинка за автентикација со прокси серверот наведен во
proxy_host, користејќи HTTP Basic автентикација. -
compressionint -
Овозможува компресија на HTTP SOAP барања и одговори.
Вредноста треба да биде бинарно ИЛИ од три дела: опционално
SOAP_COMPRESSION_ACCEPT, за испраќање на "Accept-Encoding" заглавие; илиSOAP_COMPRESSION_GZIPorSOAP_COMPRESSION_DEFLATEза да го означи алгоритмот за компресија што ќе се користи; и број помеѓу 1 и 9 за да го означи нивото на компресија што ќе се користи во барањето. На пример, за да овозможите двонасочна gzip компресија со максимално ниво на компресија, користетеSOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_GZIP | 9. -
encodingstring -
Ги дефинира внатрешните кодови на знаците. Барањата секогаш се испраќаат во UTF-8, и се претвораат до и од овој код.
-
tracebool -
Ги снима информациите за барањето и одговорот, до кои потоа може да се пристапи со методите Враќа го XML-от примен во последниот SOAP одговор., SoapClient::__getLastRequest(), SoapClient::__getLastResponse()Препорачаниот начин за избегнување на SQL инјекција е со врзување на сите податоци преку подготвени изрази. Користењето на параметризирани прашања не е доволно за целосно избегнување на SQL инјекција, но тоа е најлесниот и најбезбедниот начин за обезбедување влез во SQL изразите. Сите динамични литерали на податоци во Враќа го XML-от примен во последниот SOAP одговор..
Ако е изоставено, стандардно е
false -
classmaparray -
Се користи за мапирање на типови дефинирани во WSDL кон PHP класи. Треба да биде специфицирано како асоцијативно array со имиња на типови од WSDL како клучеви и имиња на PHP класи како вредности. Имајте предвид дека името на типот на елемент не мора да биде исто како името на елементот (таг).
Дадените имиња на класи секогаш треба да бидат целосно квалификувани со било кој namespaces, и никогаш не треба да започнуваат со водечки
\. Точната форма може да се генерира со користење на ::class.Имајте предвид дека при креирање на класа, конструкторот нема да биде повикан, но магичните __set() and __get() методи за индивидуални својства ќе бидат.
-
typemaparray -
Се користи за дефинирање на мапирања на типови користејќи кориснички дефинирани функции за повикување. Секое мапирање на типови треба да биде низа со клучеви
type_name(string кој го специфицира типот на XML елемент);type_ns(string кој содржи URI на именскиот простор);from_xml(callable прифаќа еден стринг параметар и враќа објект) иto_xml(callable прифаќа еден објект параметар и враќа стринг). -
exceptionsbool -
Дефинира дали грешките фрлаат исклучоци од типот SoapFault.
Стандардно е
true -
connection_timeoutint -
Дефинира тајм-аут во секунди за конекцијата со SOAP услугата. Оваа опција не дефинира тајм-аут за услуги со бавни одговори. За да се ограничи времето на чекање за завршување на повиците, опцијата default_socket_timeout конфигурациска опција е достапна.
-
cache_wsdlint -
Ако
wsdlпараметарот е обезбеден, и soap.wsdl_cache_enabled конфигурациската опција е вклучена, оваа опција го одредува типот на кеширање. Еден одWSDL_CACHE_NONE,WSDL_CACHE_DISK,WSDL_CACHE_MEMORYorWSDL_CACHE_BOTH.Достапни се два типа на кеш: кеширање во меморија, кое го кешира WSDL во меморијата на тековниот процес; и кеширање на диск, кое го кешира WSDL во датотека на дискот, споделена помеѓу сите процеси. Директориумот што ќе се користи за кешот на дискот се одредува со опцијата soap.wsdl_cache_dir конфигурациска опција. И двата кеша ја користат истата животна доба, одредена од опцијата soap.wsdl_cache_ttl конфигурациска опција. Кешот во меморија исто така има максимален број на записи одреден од опцијата soap.wsdl_cache_limit опцијата за конфигурација.
Доколку не е наведено, soap.wsdl_cache ќе се користи опцијата за конфигурација.
-
user_agentstring -
ќе се користи опцијата за конфигурација.
User-AgentВредноста што ќе се користи воМоже да се постави и преку
stream_context.HTTP заглавје при правење барања.
"PHP-SOAP/"Ако не е наведено, корисничкиот агент ќе бидеPHP_VERSION. -
stream_contextresource -
А следен од вредноста на креирано од stream_context_create()контекст на стрим
, што овозможува поставување дополнителни опции. Контекстот може да вклучува, SSL опции за контекстопции за контекст на сокет Опции на HTTP контекстот:
content_type,header,max_redirects,protocol_versionПрепорачаниот начин за избегнување на SQL инјекција е со врзување на сите податоци преку подготвени изрази. Користењето на параметризирани прашања не е доволно за целосно избегнување на SQL инјекција, но тоа е најлесниот и најбезбедниот начин за обезбедување влез во SQL изразите. Сите динамични литерали на податоци воuser_agent., плус избрани
'header'Имајте предвид дека следните HTTP заглавја се генерираат автоматски или од други опции и ќе бидат игнорирани ако се специфицирани воhost,connection,user-agent,content-length,content-type,cookie,authorizationПрепорачаниот начин за избегнување на SQL инјекција е со врзување на сите податоци преку подготвени изрази. Користењето на параметризирани прашања не е доволно за целосно избегнување на SQL инјекција, но тоа е најлесниот и најбезбедниот начин за обезбедување влез во SQL изразите. Сите динамични литерали на податоци воproxy-authorization -
featuresint -
опцијата за контекст:
-
SOAP_SINGLE_ELEMENT_ARRAYS -
Маска за битови за овозможување на една или повеќе од следниве карактеристики:
Ако
SOAP_SINGLE_ELEMENT_ARRAYSПри декодирање на одговор во низа, стандардното однесување е да се открие дали името на елементот се појавува еднаш или повеќепати во одреден родителски елемент. За елементи што се појавуваат само еднаш, својство на објект овозможува директен пристап до содржината; за елементи што се појавуваат повеќепати, својството содржи низа со содржината на секој соодветен елемент. -
SOAP_USE_XSI_ARRAY_TYPE -
Кога
useoption карактеристиката е овозможена, елементите што се појавуваат само еднаш се ставаат во низа со еден елемент, така што пристапот е конзистентен за сите елементи. Ова има ефект само кога се користи WSDL што содржи шема за одговорот. Погледнете го делот Примери за илустрација.encodedили својството WSDL е поставено наSOAP-ENC:Array, форсирај ги низите да користат тип на -
SOAP_WAIT_ONE_WAY_CALLS -
, наместо тип специфичен за шемата.
-
-
keep_alivebool -
Чекај одговор дури и ако WSDL укажува на еднонасочно барање.
Connection: Keep-Aliveзаглавие илиConnection: close.Стандардно е
true -
ssl_methodstring -
Ги специфицира верзијата на протоколот SSL или TLS што треба да се користи со безбедни HTTP конекции, наместо стандардното преговарање. Специфицирањето
SOAP_SSL_METHOD_SSLv2orSOAP_SSL_METHOD_SSLv3ќе форсира употреба на SSL 2 или SSL 3, соодветно. СпецифицирањетоSOAP_SSL_METHOD_SSLv23нема ефект; константата постои само за компатибилност со претходните верзии. Од PHP 7.2.0, специфицирањетоSOAP_SSL_METHOD_TLSисто така нема ефект; во претходните верзии, форсираше употреба на TLS 1.0.Имајте предвид дека SSL верзиите 2 и 3 се сметаат за несигурни и можеби нема да бидат поддржани од инсталираната OpenSSL библиотека.
Оваа опција е deprecated од PHP 8.1.0. Пофлексибилна алтернатива, која дозволува специфицирање на индивидуални верзии на TLS, е да се користи
stream_contextопцијата со контекст параметарот 'crypto_method'.<?php
// Specifying use of TLS 1.3 only
$context = stream_context_create([
'ssl' => [
'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT
]
]);
$client = new SoapClient("some.wsdl", ['context' => $context]);
-
Errors/Exceptions
SoapClient::__setLocation() ќе генерира
E_ERROR грешка ако location and
uri опциите не се обезбедени во режим што не е WSDL.
А SoapFault ќе биде фрлен исклучок ако
wsdl URI не може да се вчита.
Примери
Пример #1 SoapClient::__setLocation() example
<?php
$client = new SoapClient("some.wsdl");
$client = new SoapClient("some.wsdl", array('soap_version' => SOAP_1_2));
$client = new SoapClient("some.wsdl", array('login' => "some_name",
'password' => "some_password"));
$client = new SoapClient("some.wsdl", array('proxy_host' => "localhost",
'proxy_port' => 8080));
$client = new SoapClient("some.wsdl", array('proxy_host' => "localhost",
'proxy_port' => 8080,
'proxy_login' => "some_name",
'proxy_password' => "some_password"));
$client = new SoapClient("some.wsdl", array('local_cert' => "cert_key.pem"));
$client = new SoapClient(null, array('location' => "http://localhost/soap.php",
'uri' => "http://test-uri/"));
$client = new SoapClient(null, array('location' => "http://localhost/soap.php",
'uri' => "http://test-uri/",
'style' => SOAP_DOCUMENT,
'use' => SOAP_LITERAL));
$client = new SoapClient("some.wsdl",
array('compression' => SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_GZIP | 9));
$client = new SoapClient("some.wsdl", array('encoding'=>'ISO-8859-1'));
class MyBook {
public $title;
public $author;
}
$client = new SoapClient("books.wsdl", array('classmap' => array('book' => "MyBook")));
$typemap = array(
array("type_ns" => "http://schemas.example.com",
"type_name" => "book",
"from_xml" => "unserialize_book",
"to_xml" => "serialize_book")
);
$client = new SoapClient("books.wsdl", array('typemap' => $typemap));
?>
Пример #2 Користејќи го SOAP_SINGLE_ELEMENT_ARRAYS feature
<?php
/* Assuming a response like this, and an appropriate WSDL:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns="urn:example">
<SOAP-ENV:Body>
<response>
<collection>
<item>Single</item>
</collection>
<collection>
<item>First</item>
<item>Second</item>
</collection>
</response>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
*/
echo "Default:\n";
$client = new TestSoapClient(__DIR__ . '/temp.wsdl');
$response = $client->exampleRequest();
var_dump( $response->collection[0]->item );
var_dump( $response->collection[1]->item );
echo "\nWith SOAP_SINGLE_ELEMENT_ARRAYS:\n";
$client = new TestSoapClient(__DIR__ . '/temp.wsdl', ['features' => SOAP_SINGLE_ELEMENT_ARRAYS]);
$response = $client->exampleRequest();
var_dump( $response->collection[0]->item );
var_dump( $response->collection[1]->item );Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред
Default:
string(6) "Single"
array(2) {
[0] =>
string(5) "First"
[1] =>
string(6) "Second"
}
With SOAP_SINGLE_ELEMENT_ARRAYS:
array(1) {
[0] =>
string(6) "Single"
}
array(2) {
[0] =>
string(5) "First"
[1] =>
string(6) "Second"
}