私は PHP コードの記述には慣れていますが、オブジェクト指向コーディングはあまり使用していません。現在、SOAP (クライアントとして) とやり取りする必要がありますが、構文を正しく理解できません。SoapClient クラスを使用して新しい接続を適切に設定できる WSDL ファイルがあります。ただし、実際に正しい呼び出しを行ってデータを取得することはできません。次の (簡略化された) データを送信する必要があります。
- 連絡先ID
- 連絡先
- 概要
- 額
WSDL ドキュメントには 2 つの関数が定義されていますが、必要なのは 1 つだけです (以下の「FirstFunction」)。使用可能な関数と型に関する情報を取得するために実行するスクリプトは次のとおりです。
$client = new SoapClient("http://example.com/webservices?wsdl");
var_dump($client->__getFunctions());
var_dump($client->__getTypes());
生成される出力は次のとおりです。
array(
[0] => "FirstFunction Function1(FirstFunction $parameters)",
[1] => "SecondFunction Function2(SecondFunction $parameters)",
);
array(
[0] => struct Contact {
id id;
name name;
}
[1] => string "string description"
[2] => string "int amount"
}
次のデータを使用して FirstFunction を呼び出したいとします。
- 連絡先ID: 100
- 連絡先名: ジョン
- 概要: 石油1バレル
- 金額: 500
正しい構文は何でしょうか? いろいろなオプションを試してみましたが、SOAP 構造は非常に柔軟なので、これを行う方法は非常にたくさんあるようです。マニュアルからもわかりませんでした...
更新1: MMKからのサンプルを試しました:
$client = new SoapClient("http://example.com/webservices?wsdl");
$params = array(
"id" => 100,
"name" => "John",
"description" => "Barrel of Oil",
"amount" => 500,
);
$response = $client->__soapCall("Function1", array($params));
しかし、次のような応答が返されます: Object has no 'Contact' property
。 の出力を見るとわかるように、 と呼ばれるgetTypes()
が存在するため、何らかの方法でパラメータに Contact データが含まれていることを明確にする必要があると思いますが、問題は、どのようにするかということです。struct
Contact
更新 2: これらの構造も試しましたが、同じエラーが発生しました。
$params = array(
array(
"id" => 100,
"name" => "John",
),
"Barrel of Oil",
500,
);
同様に:
$params = array(
"Contact" => array(
"id" => 100,
"name" => "John",
),
"description" => "Barrel of Oil",
"amount" => 500,
);
どちらの場合もエラー: オブジェクトに 'Contact' プロパティがありません
ベストアンサー1
これがあなたがやるべきことです。
その状況を再現してみました…
- この例では、次のパラメータを想定して呼び出さ
WebMethod
れる.NET サンプル Web サービス (WS) を作成しました。Function1
関数1(連絡先連絡先、文字列の説明、int金額)
あなたの場合のように、ゲッター
Contact
とセッターを持つモデルはどこにありますか。id
name
.NET サンプル WS は次の場所からダウンロードできます。
https://www.dropbox.com/s/6pz1w94a52o5xah/11593623.zip
コード。
PHP 側で行う必要があるのは次の通りです:
(テスト済み、動作中)
<?php
// Create Contact class
class Contact {
public function __construct($id, $name)
{
$this->id = $id;
$this->name = $name;
}
}
// Initialize WS with the WSDL
$client = new SoapClient("http://localhost:10139/Service1.asmx?wsdl");
// Create Contact obj
$contact = new Contact(100, "John");
// Set request params
$params = array(
"Contact" => $contact,
"description" => "Barrel of Oil",
"amount" => 500,
);
// Invoke WS method (Function1) with the request params
$response = $client->__soapCall("Function1", array($params));
// Print WS response
var_dump($response);
?>
全体をテストします。
- そうすると、
print_r($params)
WS が期待するとおり、次の出力が表示されます。
配列 ( [連絡先] => 連絡先オブジェクト ( [id] => 100 [名前] => John ) [説明] => 石油 1 バレル [金額] => 500 )
- .NET サンプル WS をデバッグすると、次の結果が得られました。
(ご覧のとおり、Contact
オブジェクトもnull
他のパラメータもありません。これは、PHP 側からのリクエストが正常に実行されたことを意味します)
- .NET サンプル WS からの応答は予想どおりのものであり、PHP 側で取得した結果は次のとおりです。
object(stdClass)[3] public 'Function1Result' => string 'リクエストの詳細情報! id: 100、名前: John、説明: 石油バレル、量: 500' (長さ=98)