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