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; }