PHP での SoapClient の使用例

Habdul Hazeez 2023年12月11日
  1. PHP の Web サービスから関数と型を取得する
  2. PHP SOAP の例 1:温度変換
  3. PHP SOAP の例 2: Say Hello
  4. PHP SOAP の例 3:単純な演算
  5. PHP SOAP の例 4:国情報
  6. PHP SOAP の例 5:NuSOAP を使用した温度変換
  7. ボーナスの例:cURL を使用した SOAP 呼び出し
PHP での SoapClient の使用例

この記事では、PHP SoapClient を使用して WSDL ファイルを操作する 6つの例を紹介します。その前に、Web サービスから関数と型を取得する方法について説明します。

これは、Web サービスを使用する場合に必須です。

PHP の Web サービスから関数と型を取得する

Web サービスを使用する前に最初に行う必要があるのは、その機能とタイプを知ることです。これは、サービス関数がサービスからデータを返すためです。

そして型は、その関数に供給するかもしれない引数のデータ型です。ここでかもしれないと言ったのは、後でわかることですが、すべてのサービス関数が引数を必要とするわけではないからです。

PHP では、以下を使用して、サービスから関数と型を取得できます。サービス URL を別の URL に置き換えると、PHP は関数の名前とタイプを返します。

コードが機能するには、インターネットに接続する必要があります。

<?php
    $client = new SoapClient("http://www.dneonline.com/calculator.asmx?WSDL");
    echo "<b>The functions are:</b> <br/>";
    echo "<pre>";
    var_dump($client->__getFunctions());
    echo "</pre>";

    echo "<b>The types are:</b> <br />";
    echo "<pre>";
    var_dump($client->__getTypes());
    echo "</pre>";
?>

出力(以下は抜粋です):

<b>The functions are:</b> <br/><pre>array(8) {
  [0]=>
  string(32) "AddResponse Add(Add $parameters)"
  [1]=>
  string(47) "SubtractResponse Subtract(Subtract $parameters)"
  [2]=>
  string(47) "MultiplyResponse Multiply(Multiply $parameters)"
  [3]=>
  string(41) "DivideResponse Divide(Divide $parameters)"
  [4]=>
  string(32) "AddResponse Add(Add $parameters)"
  [5]=>
  string(47) "SubtractResponse Subtract(Subtract $parameters)"
  [6]=>
  string(47) "MultiplyResponse Multiply(Multiply $parameters)"
  [7]=>
  string(41) "DivideResponse Divide(Divide $parameters)"
}
</pre><b>The types are:</b> <br /><pre>array(8) {
  [0]=>
  string(36) "struct Add {
 int intA;
 int intB;
}"
  [1]=>
  string(38) "struct AddResponse {
 int AddResult;
}"
  [2]=>
  string(41) "struct Subtract {
 int intA;
 int intB;
}"
..........

ノート:

  1. types の下に、関数に定義されたパラメーターのデータ型があります。
  2. コードで関数に引数を指定するときは、データ型が同じである必要があります。
  3. 型定義に int intA のようなものが表示される場合、引数は intA という名前の整数である必要があります。

サービス関数とタイプを取得する方法がわかったので、サービスの操作を開始できます。

PHP SOAP の例 1:温度変換

W3schools は、温度コンバーターの WSDL ファイルを提供します。PHP から、このファイルに接続して温度変換を実行できます。

これ(および SoapClient を使用したその他の SOAP 操作)の手順は次のとおりです。

  • 新しい SoapClient オブジェクトを作成します。
  • 使用するデータを定義します。このデータは、サービスの機能が処理できる形式である必要があります。
  • サービスの関数を呼び出します。
  • 結果を表示します。

これらの手順は、次のコードで実装されています。

<?php
    // Create the client object and pass in the
    // URL of the SOAP server.
    $soap_client = new SoapClient('https://www.w3schools.com/xml/tempconvert.asmx?WSDL');
    // Create an associative array of the data
    // that you'll pass into one of the functions
    // of the client.
    $degrees_in_celsius = array('Celsius' => '25');
    // Use a function of the client for the
    // conversion.
    $convert_to_fahrenheit = $soap_client->CelsiusToFahrenheit($degrees_in_celsius);
    // Show the result using var_dump. Other PHP
    // functions like echo will not work.
    echo "<pre>";
    var_dump($convert_to_fahrenheit);
    echo "</pre>";
    // Repeat the same process. This time, use the
    // FahrenheitToCelsius function to convert a
    // temperature from Fahrenheit to Celsius.
    $degrees_in_fahrenheit = array('Fahrenheit' => '25');
    $convert_to_celsius = $soap_client->FahrenheitToCelsius($degrees_in_fahrenheit);
    echo "<pre>";
    var_dump($convert_to_celsius);
    echo "</pre>";
?>

出力:

<pre>object(stdClass)#2 (1) {
  ["CelsiusToFahrenheitResult"]=>
  string(2) "77"
}
</pre><pre>object(stdClass)#3 (1) {
  ["FahrenheitToCelsiusResult"]=>
  string(17) "-3.88888888888889"
}
</pre>

PHP SOAP の例 2: Say Hello

2 番目の例は、learnwebservices.com を使用した sayhello メッセージです。SoapClient を使用してサービスへの SOAP 呼び出しを開始するだけです。

その後、SayHello メソッドを呼び出して、希望の名前を渡します。次に、Message メソッドにアクセスしてメッセージを表示できます。

メッセージは Hello your_desired_name!である必要があります。たとえば、your_desired_nameMartinez の場合、Hello Martinez!の出力が得られます。

これは、次のコードで行ったことです。

<?php
    $soap_client = new SoapClient('https://apps.learnwebservices.com/services/hello?wsdl');
    // Call a function of the soap client.
    $say_hello = $soap_client->SayHello(['Name' => 'Martinez']);
    // Print the message from the client.
    echo $say_hello->Message;
?>

出力:

Hello Martinez!

PHP SOAP の例 3:単純な演算

この例では、簡単な計算を実行できる Web サービスを使用しています。このような算術には、加算、除算、乗算、および減算が含まれます。

ただし、ここでは、サービスを使用して追加および分割する方法のみを示します。サービスについての理解が深まるので、残りを試してみてください。

このサービスの算術関数では、番号に名前を付ける必要があります。これらの名前は intAintB であるため、簡単にするためにこれらの名前を連想配列の番号に割り当てます。

その後、この配列をサービスの追加および分割関数に渡します。次のコードは、これらすべての動作と計算結果を示しています。

<?php
    // Connect to a SOAP client that allows you
    // to do basic calculations.
    $soap_client = new SoapClient("http://www.dneonline.com/calculator.asmx?WSDL");
    // Define data that'll use with the client. This
    // time the client requires that arguments that
    // you'll pass in has the name intA and intB.
    // Therefore, we use that name in our array.
    $numbers_for_the_client = array("intA" => 222, "intB" => 110);
    $add_the_numbers = $soap_client->Add($numbers_for_the_client);
    $divide_the_numbers = $soap_client->Divide($numbers_for_the_client);
    // Show the results of the addition and
    // division of numbers.
    echo "<pre>";
    var_dump($add_the_numbers);
    var_dump($divide_the_numbers);
    echo  "</pre>";
?>

出力:

<pre>object(stdClass)#2 (1) {
  ["AddResult"]=>
  int(332)
}
object(stdClass)#3 (1) {
  ["DivideResult"]=>
  int(2)
}
</pre>

PHP SOAP の例 4:国情報

国に関する特定の詳細を取得したい場合は、この例のサービスが適しています。このサービスには、国の詳細を返す多くの機能があります。

これらの関数のいくつかは、ListOfCountryNameByCodesListOfContinentsByName です。以下では、ListOfCountryNameByCodes を使用して世界の国を印刷します。

<?php
    // A soap client that allows you to view information
    // about countries in the world
    $soap_client = new SoapClient("http://webservices.oorsprong.org/websamples.countryinfo/CountryInfoService.wso?WSDL");
    // Use a client function to print country names.
    $list_countries_names_by_code = $soap_client->ListOfCountryNamesByCode();
    /*
    Here is another function you can try out.
    $list_of_continents_by_name = $client->ListOfContinentsByName();
    */
    // Show the results.
    echo "<pre>";
    var_dump($list_countries_names_by_code);
    echo  "</pre>";
?>

出力(以下は抜粋です):

<pre>object(stdClass)#2 (1) {
  ["ListOfCountryNamesByCodeResult"]=>
  object(stdClass)#3 (1) {
    ["tCountryCodeAndName"]=>
    array(246) {
      [0]=>
      object(stdClass)#4 (2) {
        ["sISOCode"]=>
        string(2) "AD"
        ["sName"]=>
        string(7) "Andorra"
      }
      [1]=>
      object(stdClass)#5 (2) {
        ["sISOCode"]=>
        string(2) "AE"
        ["sName"]=>
        string(20) "United Arab Emirates"
      }
      [2]=>
      object(stdClass)#6 (2) {
        ["sISOCode"]=>
        string(2) "AF"
        ["sName"]=>
        string(11) "Afghanistan"
      }
 ....

PHP SOAP の例 5:NuSOAP を使用した温度変換

NuSOAP は、Web サービスへの SOAP 接続を可能にする PHP ツールです。動作モードは SoapClient を使用するのと似ていますが、次の違いがあります。

  1. nusoap_client には、引数としてサービスアドレスと wsdl が必要です。
  2. 作業するデータは XML である必要があります。

NuSOAP を使用するには、SourceForge からダウンロードして、現在の作業ディレクトリにドロップします。次に、温度変換に次のコードを使用します。

前に詳述した例外を除いて、手順は同じであることがわかります。もう 1つ、コードは PHP5 で機能し、PHP8bool を返します。

<?php
    // This PHP script use NUSOAP for SOAP connection
    // and it works in PHP5 ONLY.
    require_once('nusoap.php');
    // Specify the WSDL file and initiate a new
    // NUSOAP client.
    $wsdl   = "https://www.w3schools.com/xml/tempconvert.asmx?WSDL";
    $nusoap_client = new nusoap_client($wsdl, 'wsdl');
    // Call on the required method of the client.
    $function_from_client = "CelsiusToFahrenheit";
    // We'll save the result of the entire operation
    // in an array.
    $result = array();
    // Temperature for conversion.
    $temperature = 86;
    // Specify the temperature as an XML file
    $temperature_as_xml= '<CelsiusToFahrenheit xmlns="https://www.w3schools.com/xml/">
                <Celsius>' . $temperature . '</Celsius>
            </CelsiusToFahrenheit>';
    // If the function exists in the client, initiate
    // the conversion.
    if (isset($function_from_client)) {
        $result['response'] = $nusoap_client->call($function_from_client, $temperature_as_xml);
    }
    // Show the results
    echo "<pre>" . $temperature . ' Celsius => ' . $result['response']['CelsiusToFahrenheitResult'] . ' Fahrenheit' . "</pre>";
?>

出力:

<pre>86 Celsius => 186.8 Fahrenheit</pre>

ボーナスの例:cURL を使用した SOAP 呼び出し

cURL を使用して、Web サービスへの SOAP 呼び出しを行うことができます。ここでも、W3Schools 温度変換サービスを使用します。

一方、cURL では、サービスを操作するときに次のことを行う必要があります。

  1. データは石鹸封筒にある必要があります。
  2. コンテンツヘッダーをブラウザに送信する必要があります。
  3. cURL 接続オプションを定義する必要があります。

次のコードでは、これらすべてとそれ以上のことを行います。コードコメントは、各ステップで何が起こっているかを詳しく説明しています。

<?php
    // This script allows you to use w3schools
    // convert via curl.
    $webservice_address = "https://www.w3schools.com/xml/tempconvert.asmx";
    // The number you'll like to convert, in this case
    // we'll like to convert a temperature in celsius
    // fahrenheit.
    $temperature = 56;
    // Pass the temperature as an XML file.
    // The XML format is based on the official
    // format for the SOAP client by w3schools.
    // You can find more at:
    $temperature_as_xml = '<?xml version="1.0" encoding="utf-8"?>
    <soap12:Envelope
        xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
        xmlns:xsd="https://www.w3.org/2001/XMLSchema"
        xmlns:soap12="https://www.w3.org/2003/05/soap-envelope">
      <soap12:Body>
        <CelsiusToFahrenheit xmlns="https://www.w3schools.com/xml/">
          <Celsius>' . $temperature . '</Celsius>
        </CelsiusToFahrenheit>
      </soap12:Body>
    </soap12:Envelope>';
    // Define content headers
    $content_headers = array(
        'Content-Type: text/xml; charset=utf-8',
        'Content-Length: '.strlen($temperature_as_xml)
    );
    // Initiate the CURL connection and define
    // the connection options.
    $init_curl_connection = curl_init($webservice_address);
    curl_setopt($init_curl_connection, CURLOPT_POST, true);
    curl_setopt($init_curl_connection, CURLOPT_HTTPHEADER, $content_headers);
    curl_setopt($init_curl_connection, CURLOPT_POSTFIELDS, $temperature_as_xml);
    curl_setopt($init_curl_connection, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($init_curl_connection, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($init_curl_connection, CURLOPT_SSL_VERIFYPEER, false);
    // Use the curl_exec function to get the
    // received data.
    $recieved_data = curl_exec($init_curl_connection);
    // Save the connection result in another variable.
    // This will allow us to use it in an "if" statement
    // without causing ambiguity.
    $connection_result = $recieved_data;
    // Check if there is an error.
    if ($connection_result === FALSE) {
        printf("CURL error (#%d): %s<br>\n", curl_errno($init_curl_connection),
        htmlspecialchars(curl_error($init_curl_connection)));
    }
    // Close the CURL connection
    curl_close ($init_curl_connection);
    // Show the received data.
    echo $temperature . ' Celsius => ' . $recieved_data . ' Fahrenheit';
?>

出力(ブラウザ内):

56 Celsius => 132.8 Fahrenheit

出力(詳細バージョン):

Celsius => <?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="https://www.w3.org/2003/05/soap-envelope" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="https://www.w3.org/2001/XMLSchema">
<soap:Body>
<CelsiusToFahrenheitResponse xmlns="https://www.w3schools.com/xml/">
<CelsiusToFahrenheitResult>132.8</CelsiusToFahrenheitResult>
</CelsiusToFahrenheitResponse><
/soap:Body></soap:Envelope>Fahrenheit
著者: Habdul Hazeez
Habdul Hazeez avatar Habdul Hazeez avatar

Habdul Hazeez is a technical writer with amazing research skills. He can connect the dots, and make sense of data that are scattered across different media.

LinkedIn