// SOAP 1.1 $client = new SoapClient($wsdl, [ 'soap_version' => SOAP_1_1]);// SOAP 1.2$client = new SoapClient($wsdl, [ 'soap_version' => SOAP_1_2]);
PHP SOAP 拡張機能を学習する際の注意事項
これで SOAP の学習は終了です。これは、学習プロセス中のいくつかのメモと経験を記録する最後の記事です。
最初の 3 つの記事は次のとおりです:
「SOAP の概要」
「SOAP Web サービスの概要」
「PHP SOAP 拡張機能の使用法」
SOAP を理解する方法ウェブサービスHTTP プロトコルでは、SOAP メッセージ リクエストが発行されます。このリクエストでは、実際には HTTP 動詞の POST が使用され、SOAP メッセージを HTTP ボディに配置して送信されます。簡単に言うと、SOAP サービスが呼び出されるたびに、POST リクエストが送信されます。
以下はリクエスト インターフェースによって送信されるコンテンツです:
POST /webservices/qqOnlineWebService.asmx HTTP/1.1Host: www.webxml.com.cnConnection: Keep-AliveUser-Agent: PHP-SOAP/5.4.29Content-Type: application/soap+xml; charset=utf-8; action="http://WebXml.com.cn/qqCheckOnline"Content-Length: 247<?xml version="1.0" encoding="UTF-8"?><env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="http://WebXml.com.cn/"> <env:Body> <ns1:qqCheckOnline> <ns1:qqCode>8698053</ns1:qqCode> </ns1:qqCheckOnline> </env:Body></env:Envelope>
SOAP リクエストが実際にはサーバーに送信される POST リクエストであることがわかります。送信内容はSOAPメッセージ(今回呼び出したインターフェースのメソッドやパラメータなどを示す)です。
この POST リクエストには、送信するコンテンツ タイプが application/soap+xml であり、ユーザー エージェントが PHP-SOAP/5.4.29 であるなど、いくつかの特徴があります。その他の特徴については、あまり説明する必要はありません。 。
SOAP 拡張機能の役割
実際、インターフェイスのリクエストでは POST リクエストが送信されるだけであることがわかっているため、PHP 自体に付属するいくつかのツールやライブラリ (curl、fsockopen など) を使用して、POST の送信をシミュレートできます。 PHP の SOAP 拡張機能を使用する必要はありません。はい、そうです! PHP が SOAP 拡張機能を提供する前は、多くの人が同じことをしていました。
それでは、なぜ SOAP 拡張機能を使用するのでしょうか? 公式サイトにあるし、C言語で書かれているのでとても速いし、パッケージもしっかりしていて、面倒なXMLコードを自分で書く必要がないので、私はこれを使っています。
言い換えれば、SOAP 拡張機能は、実際には、SOAP サービスを処理するために特別に設計された、より使いやすく高速な HTTP パッケージ化ライブラリです。これについては、それほど深い意味はありません。
使用方法
PHP のヘルプ マニュアルには、SOAP 拡張機能に関する詳細なドキュメントがあり、特に、マニュアルの最後にいくつかのユーザー コメントとコード スニペットが記載されています。基本的に、問題の最も一般的な部分を解決します。以下に、開発プロセス中に遭遇したいくつかの問題と、解決策、注意が必要な点を記録します。WSDL と非 WSDL
現在、基本的にすべての SOAP Web サービスは WSDL インターフェース記述ファイルを提供するため、基本的に非 WSDL モードを考慮する必要はありません。
SOAP バージョンについて
PHP SOAP 拡張機能は、SOAP 1.1 と SOAP 1.2 の両方のバージョンをサポートしています。一般的に、現在のインターフェイスは基本的にこれら 2 つの SOAP プロトコル バージョンとの通信を同時にサポートしています。この場合、当然、SOAP 1.2 の上位バージョンが使用されます。実際、どのバージョンを使用していても、SOAP 拡張機能を使用してサービスを呼び出している場合、拡張機能を使用するプロセスに違いはなく、同じです。次のように、SoapCient の初期化時にsoap_version を SOAP_1_1 または SOAP_1_2 に設定する必要があるだけです:
// SOAP 1.1 $client = new SoapClient($wsdl, [ 'soap_version' => SOAP_1_1]);// SOAP 1.2$client = new SoapClient($wsdl, [ 'soap_version' => SOAP_1_2]);
ログイン後にコピー
SoapParam および SoapVar// SOAP 1.1 $client = new SoapClient($wsdl, [ 'soap_version' => SOAP_1_1]);// SOAP 1.2$client = new SoapClient($wsdl, [ 'soap_version' => SOAP_1_2]);
上で述べたように、今日のサービスは基本的に WSDL 記述ファイルを提供します。この場合、次のようにすることができます。これら 2 つのクラス、SoapParam と SoapVar は基本的に無視します。SOAP がこれら 2 つのクラスを提供するのは、主に PHP SOAP 拡張機能が WSDL 記述ファイルを持たない一部のサービスを使用できるようにするためです。もちろん、このような状況は基本的には存在しません。
__soapCall メソッドについて
このメソッドも同様です。WSDL モードでは、呼び出す必要があるメソッドは SoapClient オブジェクトのメソッドとして呼び出すことができるため、通常、このメソッドは非 WSDL モードでのみ使用されます。ただし、呼び出しメソッドの URI がデフォルト URI と異なる場合、またはメソッド呼び出し時に SOAP ヘッダーをメソッドに持ち込む必要がある場合は、__soapCall メソッドを使用する必要があります。以下は公式マニュアルからの抜粋です:
これは、SOAP 呼び出しを行うために使用される低レベルの API 関数です。通常、WSDL モードでは、SOAP 関数は SoapClient オブジェクトのメソッドとして呼び出すことができます。非 WSDL モードで、soapaction が不明な場合、uri がデフォルトと異なる場合、または SOAP ヘッダーを送信および/または受信する場合に便利です。以下にいくつかの例を見てみましょう。同様に、インターネット上で無料で使用できる SOAP サービスを引き続き使用して協力しています。このサービスの主な機能は、QQ 番号を通じてユーザーのオンライン ステータスを照会することです。サービス アドレス
サービスを要求するときに送信する必要がある SOAP メッセージは次のとおりです:
メソッド名を使用してインターフェイスを呼び出します:<?xml version="1.0" encoding="utf-8"?><soap12:Envelope xmlns:soap12="http://www.w3.org/2003/05/soap-envelope"> <soap12:Body> <qqCheckOnline xmlns="http://WebXml.com.cn/"> <qqCode>string</qqCode> </qqCheckOnline> </soap12:Body></soap12:Envelope>ログイン後にコピー
<?php$wsdl = 'http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl';$client = new SoapClient($wsdl, [ 'soap_version' => SOAP_1_2]);$client->qqCheckOnline([ 'qqCode' => 8698053]));
__soapCall メソッドを使用してインターフェイスを呼び出します:
<?php$wsdl = 'http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl';$client = new SoapClient($wsdl, [ 'soap_version' => SOAP_1_2]);$client->__soapCall('qqCheckOnline', [ ['qqCode' => 8698053]]);
パラメータに注目してください: 2 つの呼び出し方法は異なります。メソッド名を介して直接呼び出す場合、パラメーターは 1 次元配列ですが、__soapCall メソッドを介して呼び出す場合、パラメーターは 2 次元配列になります。これが両者の違いの 1 つです。
还有第二个区别,就是 __soapCall 方法可以在调用接口时,添加额外的 SOAP Header,比如这样:
$wsdl = 'http://www.example.com/service.asmx?wsdl';$client = new SoapClient($wsdl, [ 'soap_version' => SOAP_1_2]);$auth = ['sAuthenticate' => 'ab3cde34f5r4545g'];$namespace = 'http://www.example.com';$header = new SoapHeader($namespace, 'AuthenHeader', $auth, false);$client->__soapCall("SomeFunction", $parameters, null, $header);
虽然 SoapClient 也有 __setSoapHeaders 方法,但是它会给该实例的所有方法都添加上 SOAP Header,如果存在有些方法需要 SOAP Header 而有些又不需要的话,那么就必须使用 __soapCall 方法,针对某个方法来添加 SOAP Header 了。
关于命名空间(namespace)
实际上,在 WSDL 模式下,如果不需要发送 SOAP Header 的话,那么 namespace 是用不上的,因为 namespace 实际上已经在 WSDL 文件中有所描述了,PHP 的 SOAP 扩展会自动把它从 WSDL 文件中解析出来,用于构造 SOAP 请求。如果 SOAP 消息中,需要添加 SOAP Header 的话,那么必须提供 namespace。举个例子:
比如说,有一个服务它需要你发送的 SOAP 消息中必须有 SOAP Header,像下面一样:
<?xml version="1.0" encoding="utf-8"?><soap12:Envelope xmlns:soap12="http://www.w3.org/2003/05/soap-envelope"> <soap12:Header> <AuthenHeader xmlns="http://www.example.cn"> <sAuthenticate>string</sAuthenticate> </AuthenHeader> </soap12:Header> <soap12:Body> <GetUserInfoById xmlns="http://www.example.cn"> <UserID>int</UserID> </GetUserInfoById> </soap12:Body></soap12:Envelope>
下面是构造该 SOAP 请求的代码:
<?php$wsdl = 'http://www.example.com/service.asmx?wsdl';$client = new SoapClient($wsdl, [ 'soap_version' => SOAP_1_2]);$auth = ['sAuthenticate' => 'ab3cde34f5r4545g'];$namespace = 'http://www.example.com';$header = new SoapHeader($namespace, 'AuthenHeader', $auth, false);$client->__setSoapHeaders($header); $response = $client->GetUserInfoById([ 'UserID' => 100]);
可以看到,使用 SoapHeader 来构建一个 SOAP Header 时,必须提供 namespace,而且是正确的命名空间。
其实,构造一个 SOAP Header 的方法不止这一种写法,还有其他写法,比如你还可以这样构造与上面一样的 SOAP 消息:
<?phpclass AuthenHeader{ private $sAuthenticate; public function __construct($auth) { $this->sAuthenticate = $auth; }}$wsdl = 'http://www.example.com/service.asmx?wsdl';$client = new SoapClient($wsdl, [ 'soap_version' => SOAP_1_2 ]);$auth = 'ab3cde34f5r4545g';$namespace = 'http://www.example.com';$authenHeader = new AuthenHeader($auth);$header = new SoapHeader($namespace, 'AuthenHeader', $authenHeader, false);$client->__setSoapHeaders($header);$response = $client->GetUserInfoById([ 'UserID' => 100 ]);
关于 SoapHeader 其他更多的用法,推荐翻阅 PHP 手册中的 SOAP 章节。
关于 SoapFault
服务端在处理客户端请求发生错误时,将会抛出 SoapFault 异常。对于 SOAP 扩展中,哪些方法可能会抛出异常可以查看手册。一旦发生了异常,我们都应该捕捉它们,并妥善处理。像下面这样:
try { $client = new SoapClient($wsdl, [ 'trace' => true, 'soap_version' => SOAP_1_2 ]); .....} catch(SoapFault $e) { //在这里处理异常}
getLastRequest 和 getLastResponse
这两个方法可以查看最近一次请求和响应的内容,这两个方法对于调试很有帮助。当然,这两个方法只有在 SoapClient 实例化时,trace 参数设置为 true 才会生效。比如像这样:
<?php$wsdl = 'http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl';$client = new SoapClient($wsdl, [ 'trace' => true, 'soap_version' => SOAP_1_2]);$client->qqCheckOnline([ 'qqCode' => 8698053]));echo $client->__getLastRequest();echo $client->__getLastResponse();
getLastRequest() 输出的内容:
<?xml version="1.0" encoding="UTF-8"?><env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="http://WebXml.com.cn/"> <env:Body> <ns1:qqCheckOnline> <ns1:qqCode>8698053</ns1:qqCode> </ns1:qqCheckOnline> </env:Body></env:Envelope>
getLastResponse() 输出的内容:
<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <soap:Body> <qqCheckOnlineResponse xmlns="http://WebXml.com.cn/"> <qqCheckOnlineResult>Y</qqCheckOnlineResult> </qqCheckOnlineResponse> </soap:Body></soap:Envelope>
SoapUI 调试工具
在调试 SOAP 服务接口时,我们可以使用功能强大的 SoapUI 工具,可以很方便地调试接口。
总结
上面都是自己在学习 PHP SOAP 扩展时的一些零散的笔记,如果有不对的地方,希望大家指出,谢谢。(本文已存档 GitHub)

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











PHPには4つの主要なエラータイプがあります。1。notice:わずかなものは、未定義の変数へのアクセスなど、プログラムを中断しません。 2。警告:通知よりも深刻で、ファイルを含むなど、プログラムを終了しません。 3。ファタラー:最も深刻なのは、機能を呼び出すなど、プログラムを終了します。 4。ParseError:構文エラーは、エンドタグの追加を忘れるなど、プログラムの実行を防ぎます。

PHPでは、Password_hashとpassword_verify関数を使用して安全なパスワードハッシュを実装する必要があり、MD5またはSHA1を使用しないでください。 1)password_hashセキュリティを強化するために、塩値を含むハッシュを生成します。 2)password_verifyハッシュ値を比較して、パスワードを確認し、セキュリティを確保します。 3)MD5とSHA1は脆弱であり、塩の値が不足しており、最新のパスワードセキュリティには適していません。

PHPとPythonにはそれぞれ独自の利点があり、プロジェクトの要件に従って選択します。 1.PHPは、特にWebサイトの迅速な開発とメンテナンスに適しています。 2。Pythonは、データサイエンス、機械学習、人工知能に適しており、簡潔な構文を備えており、初心者に適しています。

PHPは、電子商取引、コンテンツ管理システム、API開発で広く使用されています。 1)eコマース:ショッピングカート機能と支払い処理に使用。 2)コンテンツ管理システム:動的コンテンツの生成とユーザー管理に使用されます。 3)API開発:RESTFUL API開発とAPIセキュリティに使用されます。パフォーマンスの最適化とベストプラクティスを通じて、PHPアプリケーションの効率と保守性が向上します。

HTTPリクエストメソッドには、それぞれリソースを取得、送信、更新、削除するために使用されるGET、POST、PUT、および削除が含まれます。 1. GETメソッドは、リソースを取得するために使用され、読み取り操作に適しています。 2. POSTメソッドはデータの送信に使用され、新しいリソースを作成するためによく使用されます。 3. PUTメソッドは、リソースの更新に使用され、完全な更新に適しています。 4.削除メソッドは、リソースの削除に使用され、削除操作に適しています。

PHPは、サーバー側で広く使用されているスクリプト言語で、特にWeb開発に適しています。 1.PHPは、HTMLを埋め込み、HTTP要求と応答を処理し、さまざまなデータベースをサポートできます。 2.PHPは、ダイナミックWebコンテンツ、プロセスフォームデータ、アクセスデータベースなどを生成するために使用され、強力なコミュニティサポートとオープンソースリソースを備えています。 3。PHPは解釈された言語であり、実行プロセスには語彙分析、文法分析、編集、実行が含まれます。 4.PHPは、ユーザー登録システムなどの高度なアプリケーションについてMySQLと組み合わせることができます。 5。PHPをデバッグするときは、error_reporting()やvar_dump()などの関数を使用できます。 6. PHPコードを最適化して、キャッシュメカニズムを使用し、データベースクエリを最適化し、組み込み関数を使用します。 7

Phpoopでは、self ::は現在のクラスを指し、親::は親クラスを指し、静的::は後期静的結合に使用されます。 1.Self ::静的方法と一定の呼び出しに使用されますが、後期静的結合をサポートしていません。 2.Parent ::サブクラスには、親クラスのメソッドを呼び出すために使用され、プライベートメソッドにアクセスできません。 3.Static ::継承と多型に適した後期静的結合をサポートしますが、コードの読みやすさに影響を与える可能性があります。

PHPは、$ \ _ファイル変数を介してファイルのアップロードを処理します。セキュリティを確保するための方法には次のものが含まれます。1。アップロードエラー、2。ファイルの種類とサイズを確認する、3。ファイル上書きを防ぐ、4。ファイルを永続的なストレージの場所に移動します。
