PHP
SOAPクライアント
サーチ…
構文
- __getFunctions() //サービス用の関数の配列を返します(WSDLモードのみ)
- __getTypes() //サービスの型の配列を返します(WSDLモードのみ)
- __getLastRequest() //最後のリクエストからXMLを返します(
trace
オプションが必要です) - __getLastRequestHeaders() //最後のリクエストからヘッダを返す(
trace
オプションが必要) - __getLastResponse() //最後のレスポンスからXMLを返します(
trace
オプションが必要です) - __getLastResponseHeaders() //最後のレスポンスのヘッダーを返します(
trace
オプションが必要です)
パラメーター
パラメータ | 詳細 |
---|---|
$ wsdl | WSDLのURIまたは非WSDLモードを使用する場合はNULL |
$ options | SoapClientのオプション配列。非WSDLモードではlocation とuri が設定されている必要があり、その他のオプションはオプションです。可能な値については、下の表を参照してください。 |
備考
SoapClient
クラスには__call
メソッドが__call
されています。これは直接呼び出すことはできません 。代わりに、これにより以下のことが可能になります:
$soap->requestInfo(['a', 'b', 'c']);
これにより、 requestInfo
SOAPメソッドが呼び出されます。
可能な$options
値の表( キーと値のペアの配列 ):
オプション | 詳細 |
---|---|
ロケーション | SOAPサーバーのURL。非WSDLモードでは必須です。 URLをオーバーライドするためにWSDLモードで使用できます。 |
ウリ | SOAPサービスのターゲット名前空間。非WSDLモードでは必須です。 |
スタイル | 可能な値はSOAP_RPC またはSOAP_DOCUMENT です。非WSDLモードでのみ有効です。 |
つかいます | 可能な値はSOAP_ENCODED またはSOAP_LITERAL です。非WSDLモードでのみ有効です。 |
soap_version | 可能な値はSOAP_1_1 ( デフォルト )またはSOAP_1_2 です。 |
認証 | HTTP認証を有効にします。可能な値は、 SOAP_AUTHENTICATION_BASIC ( デフォルト )またはSOAP_AUTHENTICATION_DIGEST です。 |
ログイン | HTTP認証のユーザー名 |
パスワード | HTTP認証のパスワード |
proxy_host | プロキシサーバーのURL |
プロキシポート | プロキシサーバーポート |
proxy_login | プロキシのユーザー名 |
proxy_password | プロキシのパスワード |
local_cert | HTTPSクライアント証明書へのパス(認証用) |
パスフレーズ | HTTPSクライアント証明書のパスフレーズ |
圧縮 | 要求/応答を圧縮する。値はのビットマスクですSOAP_COMPRESSION_ACCEPT のいずれかでSOAP_COMPRESSION_GZIP またはSOAP_COMPRESSION_DEFLATE 。例: SOAP_COMPRESSION_ACCEPT \| SOAP_COMPRESSION_GZIP 。 |
エンコーディング | 内部文字エンコーディング(TODO:可能な値) |
トレース | Boolean 、デフォルトはFALSE です。要求のトレースを有効にして、フォールトをバックトレースすることができます。 __getLastRequest() 、 __getLastRequestHeaders() 、 __getLastResponse() および__getLastResponseHeaders() 使用を有効にします。 |
クラスマップ | WSDL型をPHPクラスにマッピングします。値はキーとしてのWSDL型と値としてのPHPクラス名を持つ配列でなければなりません。 |
例外 | ブール値。 SOAPエラー例外(タイプ 'SoapFault')。 |
connection_timeout | SOAPサービスへの接続のタイムアウト(秒単位)。 |
タイプマップ | 型マッピングの配列。 :配列は、以下のキーを持つキー/値のペアであるべきtype_name 、 type_ns (名前空間URI)、 from_xml (コールバックが1つの文字列パラメータを受け付け)及びto_xml (コールバック受け入れる一つのオブジェクトパラメータ)。 |
cache_wsdl | どのようにWSDLファイルをキャッシュするべきか(もしあれば)可能な値は、 WSDL_CACHE_NONE 、 WSDL_CACHE_DISK 、 WSDL_CACHE_MEMORY またはWSDL_CACHE_BOTH です。 |
ユーザーエージェント | User-Agent ヘッダーで使用する文字列。 |
stream_context | コンテキストのリソース。 |
特徴 | ビットマスクSOAP_SINGLE_ELEMENT_ARRAYS 、 SOAP_USE_XSI_ARRAY_TYPE 、 SOAP_WAIT_ONE_WAY_CALLS 。 |
生き続ける | ( PHPバージョン> = 5.4のみ ) ブール値。 Connection: Keep-Alive ヘッダー( TRUE )またはConnection: Close ヘッダー( FALSE )のいずれかを送信しFALSE 。 |
ssl_method | ( PHPバージョン> = 5.5のみ )使用するSSL / TLSバージョン。可能な値は、 SOAP_SSL_METHOD_TLS 、 SOAP_SSL_METHOD_SSLv2 、 SOAP_SSL_METHOD_SSLv3 またはSOAP_SSL_METHOD_SSLv23 です。 |
32ビットPHPでの問題 : 32ビットPHPでは、
xs:long
自動的に整数にキャストされる32ビットより大きい数値文字列は、32ビット制限に達し、2147483647
にキャストします。この問題を回避するには、文字列をfloatにキャストしてから__soapCall()
に渡します。
WSDLモード
最初に、新しいSoapClient
オブジェクトを作成し、URLをWSDLファイルに渡します。オプションで、オプションの配列も渡します。
// 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
]);
$soap
オブジェクトを使用してSOAPメソッドを呼び出します。
$result = $soap->requestData(['a', 'b', 'c']);
非WSDLモード
これは、WSDLファイルと同様にNULL
を渡し、 location
とuri
オプションを設定することを除いて、WSDLモードに似ています。
$soap = new SoapClient(NULL, [
'location' => 'https://example.com/soap/endpoint',
'uri' => 'namespace'
]);
クラスマップ
PHPでSOAPクライアントを作成する場合は、コンフィグレーション配列でclassmap
キーを設定することもできます。このclassmap
デフォルトの代わりに、WSDLで定義されたタイプは、実際のクラスにマップされるべきかを定義StdClass
。理由は、通常の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,
]
]);
クラスマップを構成した後で、 Address
またはBook
型を返す特定の操作を実行するたびに、SoapClientはそのクラスをインスタンス化し、フィールドをデータで埋めて、操作呼び出しから返します。
// 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;
SOAP要求と応答のトレース
SOAPリクエストで送受信される内容を調べたいことがあります。次のメソッドは、要求と応答のXMLを返します。
SoapClient::__getLastRequest()
SoapClient::__getLastRequestHeaders()
SoapClient::__getLastResponse()
SoapClient::__getLastResponseHeaders()
たとえば、 ENVIRONMENT
定数があり、この定数の値がDEVELOPMENT
に設定されている場合、 getAddress
の呼び出しによってエラーがスローされたときにすべての情報をエコーしたいとします。 1つの解決策は次のとおりです。
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()
);
}
...
}