ホーム > デベロッパ > SophiaFramework > BREW C++ 逆引きコード集

BREW C++ プログラミング : SophiaFramework 逆引き FAQ・コード集

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