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>