ホームページ  >  記事  >  php教程  >  PHP には Web サービスを呼び出すための SOAP 拡張機能が付属しています

PHP には Web サービスを呼び出すための SOAP 拡張機能が付属しています

WBOY
WBOYオリジナル
2016-06-14 00:02:231053ブラウズ

php で Web サービスを呼び出す場合、php4 時代の人はすぐに nusoap を使用して呼び出すことを考えるでしょう。この nusoap は長い間更新されていませんでした。多くの抜け穴があるのではないかと心配しています。Web サービスを呼び出すには、組み込みの拡張機能を使用するのが良いのではないでしょうか。
前提条件: php5
の Web サービス拡張機能を開きます。 環境要件:
この拡張機能は GNOME xml ライブラリを使用します。このライブラリをダウンロードしてインストールするには、少なくとも libxml-2.5.4.
が必要です。
Linux では、
この拡張機能は、PHP が --enable-soap<br> で構成されている場合にのみ使用できます。 Windows の場合: <br> php.ini ファイル <font face="Verdana">extension=php_soap.dll</font> で、コメント <br> を削除するだけです。 <br> 2 番目: 電話の練習。以下は私が最近電話した内容の要約です <br> <br> <p><font face="Verdana">マニュアルの抜粋: <br> SoapClient->__soapCall()<br> 説明<br> class SoapClient { </font></p> <p><font face="Verdana">mixed __soapCall ( string function_name, array argument [, array options [,mixed input_headers [, array &output_headers]]] )</font></p> <p><font face="Verdana">}<br> これは、SOAP 呼び出しを行うために使用される低レベルの API 関数です。通常、WSDL モードでは、SOAP 関数を SoapClient メソッドとして呼び出すことができます。このメソッドは、soapaction が不明な場合、uri がデフォルトとは異なる場合に役立ちます。または SOAP ヘッダーを送信および/または受信するとき。 </font></p>エラーが発生した場合、SOAP 関数の呼び出しによって PHP が例外をスローしたり、例外が無効になっている場合は SoapFault オブジェクトを返したりすることがあります。関数呼び出しが SoapFault 例外をキャッチできなかったかどうかを確認するには、is_soap_fault( で結果を確認します。 )。<p><font face="Verdana"> </font></p>戻り値<p> SOAP 関数は 1 つまたは複数の値を返すことができます。SOAP 関数によって返される値が 1 つだけの場合、__soapCall の戻り値は単純な値になります (整数、文字列など)。 __soapCall は、名前付き出力パラメータの連想配列を返します。 <font face="Verdana"><br>例</font> 例 1. SoapClient->__soapCall() の例</p> <p> <font face="Verdana"><br><?php </font></font></p> <p><font face="Verdana">$client = new SoapClient("some.wsdl");<?php </font> $client->SomeFunction($a, $b, $c);</font></p> <p> <font face="Verdana"><br>$client->__soapCall("SomeFunction", array($a, $b, $c));</font> $client->__soapCall("SomeFunction", array($a, $b, $c), NULL,</p> new SoapHeader(), $output_headers);<p><font face="Verdana"> <br> <br></font> $client = new SoapClient(null, array('location' => "http://localhost/soap.php",</p> 'uri' => "http://test-uri/"));<font face="Verdana"> $client->SomeFunction($a, $b, $c);<p> $client->__soapCall("SomeFunction", array($a, $b, $c));<br> $client->__soapCall("SomeFunction", array($a, $b, $c),<br> array('soapaction' => 'some_action',<br> 「uri」 => 「some_uri」));<br> ?><br> <br> <br> <br> <br>1.WSDL モードでは、soapCall は、service.asmx ページを提供する asp.net Web サービスを使用します。マニュアルのほとんどの例は、呼び出しと表示が比較的簡単です。このタイプは比較的単純です。</p> <p>SOAP によって送信されるプロトコル: </p> <p>POST /servicepath/service.asmx HTTP/1.1</p> ホスト: 211.186.1.4<p> コンテンツタイプ: text/xml; charset=utf-8</p> Content-Length: 長さ<p> SOAPAction: "http://211.186.5.15/Service/ServiceMethod"<br> <br><br><br> </p> <p> <?xml version="1.0" encoding="utf-8"?><br> <envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><br>                                                                                                                                                          <body> <br> <servicemethod xmlns="http://211.186.5.15/Service"><br> <param1></param1> <br>呼び出し方法: <param2> $client = new SoapClient("http://www.xxx.com/service/service.asmx?WSDL");</param2> //パラメータ値をSOAPサーバーに送信 <br> $param1 = "p1";<param3> $param2 = "p2";</param3> $param3 = "p3";<br> </servicemethod>//serviceParam1、serviceParam2、serviceParam3は、送信されたパラメータ値に対応するパラメータ名(またはサービス側が提供するフィールド名) <br> $param = array('serviceParam1' => $param1,'serviceParam2' => $param2,'serviceParam3' => $param3);</body> <br>//メソッド名は ServiceMethod、パラメータ配列は $param です。デフォルトでは、パラメータ フィールドは渡されたパラメータ配列を示すために使用されます。</envelope> $arr = $client->__soapCall('ServiceMethod',array('parameters' => $param));</p> print_r($arr);<p> <br><br> 2.非 WSDL モードの場合、この場合、soapaction は不明です<br> <br>SOAP 送信プロトコル<br></p> <p>POST /services/SoapMethod?WSDL HTTP/1.1<br> ホスト: 220.211.1.12:8088<br> 接続: キープアライブ<br> ユーザーエージェント: PHP-SOAP/5.2.5<br> コンテンツタイプ: text/xml; charset=utf-8<br> SOAPAction: "urn:SoapMethod#ServiceMethod"<br> コンテンツの長さ: 1297</p> <p><?xml version="1.0" encoding="UTF-8"?><br> <envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="urn:SoapMethod" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns2="http://220.211.1.12" soap-env:encodingstyle="http://schemas.xmlsoap.org/soap/encoding/"><br> <body> <br> <servicemethod><br> <servicemethodsection xsi:type="ns2:ServiceObjectType"><br> <param1 xsi:type="xsd:string">01019</param1><br> <param2 xsi:type="xsd:long">10</param2><br> <param3 xsi:type="xsd:long">0</param3><br> <param4 xsi:type="xsd:long">11</param4><br> </servicemethodsection><br> </servicemethod><br> </body> <br> </envelope></p> <p>呼び出し方法: <br> 2.1 パラメータを渡します: <br> {<br> を試してください $client = 新しい SoapClient(null, <br> array('location' => 'http://192.168.1.180:8088/services/SoapPage?WSDL','uri' => 'http://192.168.1.180:8088/services/')); <br> $result = $client->__soapCall('ServiceMethod', array('fieldName' => "data")); // パラメータを配列形式で渡します <br> //$result = $client->__soapCall('ServiceMethod', array(new SoapParam("data", 'fieldName'))); // パラメーターを構築し、サーバー パラメーターを構築する形式でサーバーに渡します <br> var_dump($result);<br> }<br> catch (例外 $e) <br> {<br> printf("メッセージ = %s",$e->__toString());<br> }<br> <br> 付属:マニュアル解説<br> class SoapParam { </p> <p>__construct (混合データ、文字列名)</p> <p>}<br> パラメータ</p> <p>データ<br> 渡すか返すデータ。このパラメータを PHP 値として直接渡すこともできますが、この場合は paramN という名前が付けられるため、SOAP サービスはそれを理解できない可能性があります。 </p>名前<p> パラメータ名<br> </p>2.2 複数のパラメータを渡す: <p> サーバーが非 wsdl でオブジェクト パラメーターを渡す必要があり、オブジェクトに複数の属性が含まれている場合、コードは次のようになります <br> </p>{<p>を試してください $client = new SoapClient(null, array('location' => 'http://192.168.1.180/services/SoapPage?WSDL','uri' => 'urn:SoapName')); URI アドレスである場合もあります <br> </p> クラス Obj{ <p> パブリック $param1 = '01019';<br> public $param2 = 10;<br> public $param3 = 0;<br> public $param4 = 11;<br> }<br> </p> $struct = new Obj() //サーバーが渡す必要のあるオブジェクトを作成します<p> //サーバーが異常で、渡されたパラメーターの一部が、使用しているプログラミング言語で使用できないデータ型である場合、たとえば、私は PHP を使用していますが、Java Long 型はありません (一般に、Web サービスを実行する場合は、汎用性を考慮する必要があります) 、データ型はすべて string 型または int 型であり、サーバー側で変更する方法はありません。パラメータは必須です)。この処理は、SOAP 送信内の XML を変換するだけであり、実際に転送されるデータ型ではありません。 $struct->param1 = iconv('gb2312','utf-8',$struct->param1);<br> $struct->param2 = 新しい SoapVar($struct->param2,XSD_LONG);<br> $struct->param3 = 新しい SoapVar($struct->param3,XSD_LONG);<br> $struct->param4 = 新しい SoapVar($struct->param4,XSD_LONG);<br> <br> //シリアル化されたオブジェクトで SoapVar を使用する方法は、PHP マニュアルの SoapVar の説明を参照します。各パラメーターはわかりやすく説明されています。 $soapstruct = new SoapVar($struct, SOAP_ENC_OBJECT, "ServiceObjectType", "http://soapinterop.org/xsd"); //オブジェクトのシリアル化、違いに注意してください。SOAP オブジェクトのシリアル化では、serialize </p> $result = $client-> ServiceMethod(new SoapParam($soapstruct, 'ServiceMethodSection')); //$result = $client->__soapCall('ServiceMethod', array(new SoapParam($soapstruct, 'ServiceMethodSection')));<p> <br> var_dump($result);<br> } catch (例外 $e) {<br> printf("メッセージ = %s",$e->__toString());<br> }<br> <br>添付: PEAR マニュアルにある SoapVar の説明<br> SoapVar<br> SoapVar -- 変数の Returntype を変更します<br> 説明</p> <p>新しい SoapVar (混合変数、long 型)<br> <br>警告 <br> この関数は実験的です。つまり、この関数の動作、具体的にはここに記載されているものはすべて、このパッケージの将来のリリースで予告なく変更される可能性があります。この関数は自己責任で使用してください。 > </p> 変数の戻り値の型を変更して、たとえば <p> 以外のアプリケーションでより適切に動作できるようにすることができます。 </p>type は次のいずれかである必要があります <p></p> <p>XSD_1999_TIMEINSTANT <br> XSD_STRING <br> XSD_BOOLEAN <br> XSD_DECIMAL <br> XSD_FLOAT <br> XSD_DOUBLE <br> XSD_DURATION <br> XSD_DATETIME <br> XSD_TIME <br> XSD_DATE <br> XSD_GYEARMONTH <br> XSD_GYEAR <br> XSD_GMONTHDAY <br> XSD_GDAY <br> XSD_GMONTH <br> XSD_HEXBINARY <br> XSD_BASE64BINARY <br> XSD_ANYURI <br> XSD_QNAME <br> XSD_NOTATION <br> XSD_NORMALIZEDSTRING <br> XSD_TOKEN <br> XSD_LANGUAGE <br> XSD_NMTOKEN <br> XSD_NAME <br> XSD_NCNAME <br> XSD_ID <br> XSD_IDREF <br> XSD_IDREFS <br> XSD_ENTITY <br> XSD_ENTITYS <br> XSD_INTEGER <br> XSD_NONPOSITIVEINTEGER <br> XSD_NEGATIVEINTEGER <br> XSD_LONG <br> XSD_INT <br> XSD_SHORT <br> XSD_BYTE <br> XSD_NONNEGATIVEINTEGER <br> XSD_UNSIGNEDLONG <br> XSD_UNSIGNEDINT <br> XSD_UNSIGNEDSHORT <br> XSD_UNSIGNEDBYTE <br> XSD_POSITIVEINTEGER <br> </p></font><p> <br> HTTP协议精解.rar<br> SOAP协议规范.rar<br> </p>

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。