RPC による Web サービス呼び出し方法
SFXSOAPRPC::Invoke() メソッドを使用して Web サービスを呼び出します。
// Amazon の ID を設定する
#define AMAZON_ID ""
SFMTYPEDEFCLASS(SOAPTest)
class SOAPTest : public SFCApplication {
SFMSEALCOPY(SOAPTest)
private:
// SOAP RPC プロトコルを扱う変数
SFXSOAPRPC _rpc;
Void OnSOAP(Void);
static Void OnResultSHP_SOAP(SFCError error,
const SFXSOAPRPC::Params& result,
const SFXSOAPRPC::FAULT& fault,
SFXSOAPParserConstRef soap,
VoidPtr reference);
Void OnResult_SOAP(SFCError error,
const SFXSOAPRPC::Params& result,
const SFXSOAPRPC::FAULT& fault,
SFXSOAPParserConstRef soap);
};
Void SOAPTest::OnSOAP(Void)
{
// メソッド名を設定する
_rpc.SetMethodName("ItemSearch");
// ターゲットとなるURIを設定する
_rpc.SetTargetObjectURI("https://webservices.amazon.com/");
// Web サービスのパラメーターを設定する
_rpc.AddParameter("AWSAccessKeyId",
SFXBuffer(SFXAnsiString(AMAZON_ID)));
_rpc.AddParameter("Keywords",
SFXBuffer(SFXAnsiString("caviar")));
_rpc.AddParameter("MerchantId",
SFXBuffer(SFXAnsiString("Amazon")));
_rpc.AddParameter("SearchIndex",
SFXBuffer(SFXAnsiString("GourmetFood")));
// SSL の検証モードを設定する
_rpc.SetTrustMode(SSL_TRUST_MODE_IGNORE);
// Web サービスを呼び出す
_rpc.Invoke("https://soap.amazon.com/onca/soap?Service=AWSECommerceService",
"https://soap.amazon.com",
OnResultSHP_SOAP,
this);
}
// コールバック関数
// error : エラー値
// result : SOAP の戻り値
// fault : SOAP 文書中でエラーである Fault 要素の内容
// soap : SOAP 文書のリファレンス
// reference : コールバック関数に渡されるデータ
Void SOAPTest::OnResultSHP_SOAP(SFCError error, const SFXSOAPRPC::Params& result, const SFXSOAPRPC::FAULT& fault, SFXSOAPParserConstRef soap, VoidPtr reference)
{
static_cast(reference)->OnResult_SOAP(error, result, fault, soap);
}
// SOAP 文書を処理する関数
Void SOAPTest::OnResult_SOAP(SFCError error, const SFXSOAPRPC::Params& result, const SFXSOAPRPC::FAULT& fault, SFXSOAPParserConstRef soap)
{
if (error == SFERR_NO_ERROR) {
// SFXSOAPRPC::Params で各要素値を取得する
// Params 配列は SOAP 文書に出てくる要素の順に保存する
// 列挙子を取得する
SFXSOAPRPC::Params::Enumerator para = result.GetFirstEnumerator();
while (para.HasNext()) {
// 各要素を取得する
SFXSOAPRPC::LPPARAMETER temp = para.GetNext();
// パラメーターの名前を取得し、表示する
TRACE("parameter-name: %s", temp->_name.GetCString());
// パラメーターのタイプを取得し、表示する
TRACE("parameter-type: %d", temp->_type);
if (!temp->_value.IsEmpty()) {
// パラメーターの値を取得し、表示する
TRACE("parameter-value: %s",
ACharConstPtr(temp->_value.GetBuffer()));
}
}
}
// サーバーから、エラー メッセージを取得する
else if (error == SFERR_SOAP_FAULT_MESSAGE) {
// faultactor 要素が空でない場合
if(!fault._faultactor.IsEmpty())
// faultactor 要素を表示する
TRACE("faultactor: %s", fault._faultactor.GetCString());
// faultcode 要素が空でない場合
if(!fault._faultcode.IsEmpty())
// faultcode 要素を表示する
TRACE("faultcode: %s", fault._faultcode.GetCString());
// faultstring 要素が空でない場合
if(!fault._faultstring.IsEmpty())
// faultstring 要素を表示を表示する
TRACE("faultstring: %s", fault._faultstring.GetCString());
// detail 要素が空でない場合
if (fault._faultdetail)
// detail 要素を表示を表示する
TRACE("faultstring: %s", fault._faultdetail->GetText().GetCString());
}
return;
}









