青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

woaidongmao

文章均收錄自他人博客,但不喜標題前加-[轉貼],因其丑陋,見諒!~
隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
數據加載中……

使用 XML-RPC 為 C++ 應用程序啟用 Web 服務(將 C++ 方法作為服務公開的詳細指南)

級別: 中級

Karthik Subbian (ksubbian@in.ibm.com), 高級軟件工程師, IBM India
Ramakrishnan Kannan (rkrishnan@in.ibm.com),
高級軟件工程師, IBM India

2006 9 18

XML-RPC 是一個簡單而強大的輕量級消息傳遞協議,可支持基于 XML 的跨異類平臺的通信。在本文中,您將了解如何為 C++ 程序構建基于 XML-RPC 的服務。

引言

Internet 現在的受歡迎程度越來越高,由于這個原因及其固有的優勢,促使開發人員和 IT 部門開始著手將復雜的 C/C++ 業務和科學應用程序向基于 Web 的環境遷移。簡單對象訪問協議(Simple Object Access ProtocolSOAP)、代表性狀態傳輸(Representational State TransferREST)以及 XML 遠程過程調用協議(XML Remote Procedure CallXML-RPC)等 Web 服務協議可幫助將此類遺留應用程序集成到萬維網,例如,可以使用 XML-RPC 作為將現有 C/C++ 程序與其他客戶端技術集成的機制。這篇文章將幫助您確定何時選擇 XML-RPC 而不使用 SOAP REST。另外,本文還提供了詳細步驟指南以及使用開放源代碼 XML-RPC 庫的 C++ 集成示例代碼片段。

為什么選擇 XML-RPC

集成 C/C++ 的挑戰可以通過多種方式加以解決。C/C++ 代碼集成的典型方法包括通過公共對象請求代理體系結構(Common Object Request Broker ArchitectureCORBA)、分布式組件對象模型(Distributed Component Object ModelDCOM)、遠程方法調用(Remote Method InvocationRMIInternet ORB互聯協議(Internet Inter-ORB ProtocolIIOP)以及 Java? 本機接口(Java? Native InterfaceJNI)等進行集成。

1 顯示了利用現有 C++ 代碼集成(使用上面提到的典型方法)的采用不同編程語言(JavaVC++PL/1)開發的三個不同應用程序。



1. 沒有 XML-RPC 的當前方案
clip_image001

正如您看到的,C++ 代碼應為每個 RMI/IIOP/JNICORBA DCOM 客戶端集成技術公開相應的接口。這就要求進行三次開發工作,顯然會使部署和管理此類復雜接口的過程變得更為困難和麻煩。

在這些情況下,XML-RPC 是一個更好的選擇,因為它可能幫助簡化開發、部署和管理工作。

 

clip_image003

關于 XML-RPC REST

XML-RPC UserLand Software Dave Winer 1998 年提出的。請訪問 Dave Winer 的博客,以了解他關于 XML-RPC 的最初想法。

REST 最初是由 Roy Thomas Fielding 作為其在加州大學爾灣分校的博士論文的一部分提出的。



2. 使用 XML-RPC
clip_image004

2 顯示了如何使用 XML over HTTP 通過遠程過程調用來調用 C++ 程序。SOAP REST 等備選技術也能用于相同的目的。不過,您將在下一部分中了解到,這些技術之間存在一些關鍵區別。

SOAPXML-RPC REST 間的對比

盡管這三個協議都支持 XML-RPC over HTTP,但就 C++ 而言,它們彼此之間是有區別的。表 1 提供了這些協議的各個元素間詳細的比較。


1. SOAPXML-RPC REST 間的對比

 

SOAP

XML-RPC

REST

定義

SOAP 是用于在分散的分布式環境中進行信息交換的輕量級協議。該協議基于 XML,包括三個部分:信封、一組編碼規則以及用于表示遠程過程調用和響應的約定。

這是使用 HTTP 作為傳輸協議和使用 XML 作為編碼方式的遠程過程調用。XML-RPC 的設計力求簡單,并同時允許傳輸、處理和返回復雜數據結構。

代表性狀態傳輸旨在反映設計良好的 Web 應用程序的行為圖像:由網頁組成的網絡,其中用戶通過選擇鏈接繼續進行使用,選擇鏈接將導致將下一頁傳輸給用戶并進行呈現,以供其使用。

目標

SOAP 可實現用戶定義的數據類型,提供指定接收者的功能、消息特定的處理控制以及其他功能,從而對 XML-RPC 進行了擴展。

非常簡單且條理清楚的可擴展格式。HTML 編碼人員應該能夠查看包含 XML-RPC 過程調用的文件,理解其進行的工作,并能夠對其進行修改,只需一兩次嘗試就能使其正常工作。此協議非常容易實現,可以快速對其進行調整,以在其他環境或其他操作系統上運行。

創建 REST 的目的是為了提供有關 Web 應該如何運行的設計模式,并作為 Web 標準和設計 Web 服務的指導框架。

支持的數據類型

整數、BooleanASCII 字符串、雙精度帶符號浮點數、日期時間、結構、數組、字節數組、枚舉、用戶定義數據類型、多態訪問器

整數、BooleanASCII 字符串、雙精度帶符號浮點數、日期時間、結構、數組。

特定于實現。通常支持的類型有整數、BooleanASCII 字符串、雙精度帶符號浮點數、日期時間、集合、列表、屬性。

簡單性

XML-RPC 略微復雜

易于理解和進行開發

特定于實現

穩定性

W3C 接受的標準

不是標準

體系結構參考。不需要標準

互操作性

無法與 REST/XML-RPC 互操作

無法與 REST/SOAP 互操作

無法與 SOAP/XML-RPC 互操作

工具

很多主要公司(包括 IBM Microsoft)均已開始在其工具中支持 SOAP

工具仍在開發中。

并沒有很多工具支持。

自定義能力

高度可自定義,不受數據類型和協議限制

輕量級,只能在 HTTP 上工作,具有有限的數據類型支持

只能在 HTTP 上工作

有很多開放源代碼庫可用。

有很多開放源代碼庫可用。將在下面的部分進行說明

并沒有很多實現庫可用


2. C++ 的各種 XML-RPC 實現

庫和包名稱

說明

PDEL

Packet Design Embedded Library 是一個 C 庫,其中通過 http_xml_send_xmlrpc http_servlet_xmlrpc 方法包含了客戶機和服務器的 XML-RPC 實現。這些函數將幫助通過 HTTP 傳輸協議發送自定義 XML 數據。這個包還包含很多 XML-RPC 之外的其他功能。

XMLRPC++

這是 XML-RPC C++ 實現。其中提供了簡單的服務器和客戶機。通過使用面向對象的技術,我們可以集成這些服務器和客戶機類,并實現我們自己的 XML-RPC 服務器,以將業務功能作為服務公開。在本文中,我們的示例實現及相關示例將使用這個庫。

XMLRPC-C

這是一個 C 實現,可供 C C++ 應用程序用于將這些方法作為服務公開。此包中包括一個 abyss Web 服務器。為了公開 C++ 方法,我們可以為所需的 C++ 方法編寫 C 樣式的包裝,然后使用此庫公開此方法。

 

安裝 XML-RPC++

C++ 程序啟用 XML-RPC 的第一步是下載并安裝 XML-RPC 庫實現。為 C++ 程序提供了各種實現。可以在參考資料部分獲得一個指向更多實現的鏈接。

我們的示例程序將使用 XMPLRPC++ 實現。有關將此實現下載并安裝到 LinuxAIX32 Windows 平臺以及其他類似平臺的詳細信息,請參閱參考資料部分。我們的示例實現將基于 Red Hat 9 平臺,使用的是 XML-RPC++ 0.7 庫。

示例 C++ 應用程序

此處的示例應用程序是一個簡單的兩個整數相加的操作,將使用名為“operations”的用戶定義類。清單 1 顯示了 operations 類的代碼片段。

 

clip_image003

您知道嗎?

可以使用 Eclipse 作為開發 C/CPP 應用程序的 IDE。有關更多信息,請訪問 Eclipse CDT


清單 1. Operations

        
class operations {
public:
   int add();
   operations(int i, int j);
 
private:
   int op1;//Operand 1
   int op2;//Operand 2
};

 

該類的構造函數接受兩個整數參數,并將其分別設置為私有變量 op1 op2。該類的 add 方法如清單 2 中所示。這個方法就是要作為 XML-RPC 服務公開的方法。


清單 2. Operations.cpp

        
int operations::add()
{
        std::cout << "Sum of "<<op1<<" + "<<op2<<" = "<<op1+op2<<std::endl;
        return(op1 + op2);
}

 

clip_image005
clip_image006

clip_image002

 

 

XML-RPC 庫的組件

在此部分,我們將使用一個類關系圖來說明 XML-RPC 庫的各個組件,并介紹其如何與我們服務器端的 operations 類通過接口連接。



3. XML-RPC 庫和示例應用程序的類關系圖
clip_image007

3 對每個類進行了詳細說明。


3. 類詳細信息

類名稱

用途

Operations

要公開的 add 方法在該類中實現

Add

調用 operations add 方法的包裝類。該類也從 myXmlRpcServerMethod 繼承

myXmlRpcServerMethod

該類從 XML-RPC 庫的 XmlRpcServerMethod 類繼承。該類的 execute 將在 Add 類中通過繼承覆蓋。

xmlRpcServermethod

需要向服務器注冊的每個方法都必須通過 myXmlRpcServerMethod 類從該類進行繼承,并實現自己的 execute 方法。這個 execute 方法將為公開的實際服務的包裝。服務器收到 XML-RPC 調用時,將會直接觸發此包裝類的 execute 方法。在我們的示例中,Add 將為包裝類,從客戶端調用“Add”服務時,將調用其 execute 方法。

myXmlRpcServer

該類具有兩個重要的私有變量

  1. pm_serverMethods:指向在服務器中注冊的 myXmlRpcServerMethods 的指針列表。
  2. pm_xmlRpcServer:用于設置服務器 IP、端口和其他屬性。


三個重要的方法

  1. Class constructor:使用 IP/端口詳細信息初始化服務器對象,并將其綁定。
  2. pm_registerMethods:創建指向 Add 類的指針對象,并將其加入列表 pm_serverMethods 中。
  3. runxmlRpcServer 類中 work 方法的包裝

xmlRpcServer

該類是創建服務器對象的 XML-RPC 服務器類。該類具有以下兩個重要的方法

  1. bindAndListen(port):綁定并偵聽指定的特定端口
  2. work(...):啟動服務器

清單 3 顯示了上表中每個類的每個 .cpp 文件的代碼。由于 xmlRpcServer xmlRpcServerMethod 是在 XML-RPC 庫中實現的,因此我們將重點討論剩下的四個類。



清單 3. myXmlRpcServer.cpp

        
#include "myXmlRpcServer.h"
 
using namespace XmlRpc;
using namespace std;
 
myXmlRpcServer::myXmlRpcServer()
{
//call register methods
pm_registerMethods();
 
//set port bind and listen
int port = 8085;
pm_xmlRpcServer.bindAndListen(port);
std::cout<<"XmlRpcSever running in port "<<port<<std::endl;
}
 
void
myXmlRpcServer::pm_registerMethods()
{
        Add* a=new Add(&pm_xmlRpcServer);
        myXmlRpcServerMethod *p=a;
        pm_serverMethods.push_back(p); 
}
 
void
myXmlRpcServer::run()
{
        pm_xmlRpcServer.work(-1);
}



清單 4. myXmlRpcServer.h

        
#include <iostream>
#include "myXmlRpcServerMethods.h"
#include "XmlRpc.h"
 
class myXmlRpcServer {
public:
        myXmlRpcServer();
        void run();
private: 
        void pm_registerMethods();
        XmlRpc::XmlRpcServer pm_xmlRpcServer;
        std::list< myXmlRpcServerMethod* > pm_serverMethods;
};

 

清單 5 和清單 6 顯示了用于將方法注冊到 XmlRpc Server(作為 XML-RPC 庫的一部分提供)的類的代碼。



清單 5. myXmlRpcServerMethods.cpp

        
#include <iostream>
#include "myXmlRpcServer.h"
#include "operations.h"
 
using namespace std;
 
Add::Add(XmlRpcServer* s) : myXmlRpcServerMethod("Add", s) {};
 
Void Add::execute(XmlRpcValue & params, XmlRpcValue& result)
{
 operations a(10,12);
 try 
    {
      cout << "Inside Add::execute method\n";
      result = a.add();
    }
  catch(std::exception & stde)
    {
      throw XmlRpcException(stde.what());
    }
}




清單 6. myXmlRpcServerMethods.h

        
class myXmlRpcServerMethod : public XmlRpcServerMethod
{
public:
  myXmlRpcServerMethod
   (const char *name, XmlRpcServer * server):XmlRpcServerMethod(name, server) {}
   virtual void execute(XmlRpcValue & params, XmlRpcValue& result) {assert(0);}
};
 
class Add:public myXmlRpcServerMethod
{
public:
   Add(XmlRpcServer* s); 
   virtual void execute(XmlRpcValue & params, XmlRpcValue& result);
};

 

服務器驅動程序

服務器端的入口點將是服務器驅動程序。將從此處實例化 myXmlRpcServer 對象,并調用 run() 方法,而后者將最終啟動服務器。


清單 7. myServerDriver.cpp

        
#include <iostream>
#include "myXmlRpcServer.h"
 
int main(int argc, char* argv[])
{
        myXmlRpcServer GeeBoomBaa;
        std::cout<<"About to run the server\n";
        GeeBoomBaa.run();
        return 0;
}

 

clip_image005
clip_image006

clip_image002

 

 

啟動服務器

為了編譯該代碼,請記住包含 (XML_RPC_INSTALL_DIR)/src (XML_RPC_INSTALL_DIR)/include 目錄。為了進行鏈接,請包含 libXmlRpc.a 庫。代碼成功編譯并鏈接后,將獲得一個可執行文件,該文件就是 XML-RPC 服務器。在我們的示例實現中,服務器將運行于 localhost 上,并偵聽端口 8085。這個設置硬編碼在 myXmlRpcServer.cpp 文件中。也可以使程序讀取配置文件,或者從命令行提示符將此作為參數傳遞給程序。運行成功進行了編譯和鏈接后得到的 a.out 程序,以啟動服務器。

 

clip_image005
clip_image006

clip_image002

 

 

示例客戶機

示例客戶機應該從 XML-RPC 庫提供的 XmlRpcClient 類實例化一個對象。該類的“execute(...)”將實際接受三個參數:

  1. 方法名稱,const char* 類型
  2. 端口號,const int 類型
  3. 可選的 URL 字符串,以作為 http get header 中的 URI 進行發送

清單 8 顯示了一個示例客戶機,此客戶機將執行“add(...)”方法,并在客戶端輸出結果。


清單 8. sampleClient.cpp

        
#include <iostream>
#include "XmlRpc.h"
using namespace XmlRpc;
 
int main(int argc, char* argv[])
{
        const char *server = "localhost";
        const int port = 8085;
        const char *uri = NULL;
        XmlRpcValue args, res;
 
        XmlRpcClient c( server, port, uri);
        c.execute("Add", args, res);
        std::cout<<"result is "<<res<<std::endl;
}

 

clip_image005
clip_image006

 

結束語

XML-RPC 是一個簡單而強大的輕量級消息傳遞協議,可支持基于 XML 的跨異類平臺通信。此標準固有的簡單性在將遺留應用程序與企業集成方面表現得非常強大而實用。由于各個 XML-RPC 實現都是開放源代碼的,使得此技術在企業應用程序集成領域越來越受歡迎。隨著越來越多的成熟 XML-RPC 工具的出現,我們可以預見,在不久的將來,此技術將成為企業內部集成的事實標準。

 

參考資料

學習


獲得產品和技術


討論

 

作者簡介

clip_image002

clip_image008

clip_image009

Karthik Subbian 目前在班加羅爾的 IBM India Software Laboratory 進行為制造企業構建優化產品方面的工作。他還具備幫助客戶管理應用程序并將其遷移到 IBM 平臺方面的經驗。他感興趣的軟件領域包括網格計算、XMLWeb 服務和 SOA。他曾與他人合著了多本有關網格計算技術的 IBM 紅皮書。他是 IBM 認證 XML 解決方案開發人員和 Sun 認證 Java 程序員。

 

clip_image002

clip_image010

clip_image009

Ramakrishnan Kannan 在班加羅爾的 IBM India Software Laboratory 進行主機集成方面的工作。他曾擔任過 IBM 個人通信和通信服務器產品方面的開發人員。除了承擔的開發工作外,他還與 IBM 亞太區的客戶合作進行為主機應用程序啟用 Web 服務方面的工作。他曾為 Infosys developerWorks 的業務合作伙伴舉辦過旨在提高 Web 服務意識的培訓。他是 IBM 認證 XML 解決方案開發人員和 Sun 認證 Java 程序員。他感興趣的領域包括主機集成、分布式計算、SOA 和網絡。

 

posted on 2009-06-06 00:48 肥仔 閱讀(2141) 評論(0)  編輯 收藏 引用 所屬分類: 網絡編程

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品丝袜91| 欧美欧美天天天天操| 亚洲精品国产精品乱码不99| 午夜免费久久久久| 最近中文字幕mv在线一区二区三区四区| 欧美日韩精品高清| 欧美综合国产精品久久丁香| 在线一区视频| 欧美激情第8页| 久久精品国产一区二区三区| 亚洲免费观看高清在线观看 | 国产在线一区二区三区四区| 欧美日韩国产一级片| 久久久人成影片一区二区三区观看| 亚洲精品国产精品国产自| 欧美xart系列高清| 久久www免费人成看片高清| 亚洲视频欧美视频| 亚洲人成啪啪网站| 极品尤物久久久av免费看| 国产欧美在线看| 国产精品香蕉在线观看| 欧美日韩亚洲一区二区三区四区| 美日韩精品免费观看视频| 久久精品人人做人人爽电影蜜月| 午夜久久久久久| 亚洲一区二区影院| 亚洲在线观看免费| 亚洲免费中文字幕| 亚洲在线第一页| 亚洲综合第一| 亚洲欧美乱综合| 亚洲欧美视频在线观看| 亚洲女人av| 亚洲午夜影视影院在线观看| 亚洲一区二区3| 99综合视频| 一区二区三区欧美| 一本一本久久a久久精品牛牛影视| 日韩一级精品视频在线观看| 日韩亚洲欧美成人| 在线一区二区日韩| 亚洲欧美日韩直播| 欧美影院久久久| 久久久伊人欧美| 欧美成人一品| 欧美日本高清一区| 国产精品进线69影院| 国产精品欧美久久久久无广告| 国产精品一区二区女厕厕| 国产毛片一区二区| 伊伊综合在线| 亚洲美女av黄| 亚洲欧美国产另类| 久久婷婷av| 欧美高清在线视频观看不卡| 亚洲精品日日夜夜| 亚洲图片欧美日产| 久久精品国产欧美亚洲人人爽| 久久久欧美一区二区| 欧美国产一区二区| 国产精品国产福利国产秒拍| 国产亚洲精品bv在线观看| 尤物精品在线| 亚洲午夜电影在线观看| 久久精品国产v日韩v亚洲| 老司机精品视频一区二区三区| 欧美护士18xxxxhd| 亚洲视频精选| 久久天天躁狠狠躁夜夜爽蜜月| 欧美激情性爽国产精品17p| 国产精品色婷婷| 亚洲电影激情视频网站| 一区二区免费在线视频| 久久se精品一区二区| 亚洲成人在线网| 亚洲一区中文字幕在线观看| 久久免费视频在线| 国产精品vvv| 在线精品在线| 午夜精彩国产免费不卡不顿大片| 卡一卡二国产精品| 一本色道久久综合狠狠躁的推荐| 欧美制服丝袜第一页| 欧美日韩的一区二区| 国产综合欧美在线看| 日韩午夜av电影| 欧美在现视频| 亚洲精品在线观| 久久久精品一区二区三区| 欧美日韩一区二区在线观看视频| 韩国精品久久久999| 亚洲先锋成人| 亚洲国产精品嫩草影院| 欧美一级在线播放| 欧美日韩一二三区| 亚洲高清网站| 久久久久国产成人精品亚洲午夜| 日韩视频免费在线观看| 久久青草福利网站| 国产美女精品一区二区三区| 99亚洲视频| 欧美成人精品在线播放| 香蕉久久国产| 国产精品日韩精品欧美在线| 亚洲另类在线视频| 免费看的黄色欧美网站| 亚洲欧美视频在线观看| 欧美亚一区二区| 日韩一区二区精品葵司在线| 牛人盗摄一区二区三区视频| 午夜久久福利| 国产精品入口尤物| 亚洲一区二区三区乱码aⅴ| 亚洲成人在线视频播放| 久久狠狠久久综合桃花| 国产欧美视频一区二区| 亚洲欧美在线网| 亚洲图色在线| 国产精品福利网站| 亚洲五月六月| 一区二区三区国产盗摄| 欧美日韩一区国产| 亚洲特级毛片| 一本色道久久综合狠狠躁篇的优点| 欧美成人午夜剧场免费观看| 亚洲国产日本| 亚洲高清久久网| 美女91精品| 亚洲精品一二区| 亚洲第一综合天堂另类专| 免费不卡在线观看| 亚洲国产精品尤物yw在线观看| 蜜臀av在线播放一区二区三区| 久久九九99视频| 精品成人一区二区| 欧美黄色aa电影| 欧美国产大片| 一区二区欧美激情| 亚洲最新在线视频| 欧美午夜不卡在线观看免费| 亚洲男人的天堂在线观看| 亚洲午夜国产一区99re久久| 国产精品日韩一区二区| 欧美中文字幕精品| 久久国产欧美日韩精品| 在线观看一区二区精品视频| 欧美成人性网| 欧美精品二区| 亚洲在线一区| 欧美亚洲免费电影| 在线成人av.com| 欧美激情中文字幕在线| 欧美日韩国产限制| 午夜伦欧美伦电影理论片| 欧美在线视频日韩| 亚洲国产精品高清久久久| 亚洲六月丁香色婷婷综合久久| 国产精品av一区二区| 久久九九免费| 欧美成人在线影院| 亚洲欧美国产毛片在线| 久久er99精品| 日韩视频一区二区| 亚洲天堂免费观看| 激情久久中文字幕| 亚洲人成网站色ww在线 | 韩国一区二区三区在线观看| 欧美大片网址| 国产精品久久久久久亚洲毛片| 久久乐国产精品| 欧美精品一区二区三区蜜桃| 午夜久久黄色| 老鸭窝91久久精品色噜噜导演| 亚洲天堂av在线免费| 欧美在线播放一区二区| 99视频一区| 欧美在线www| 在线视频免费在线观看一区二区| 午夜日韩av| 一本大道久久精品懂色aⅴ| 香蕉亚洲视频| 亚洲社区在线观看| 久久精品一区蜜桃臀影院| 亚洲一区二区成人| 久久视频这里只有精品| 亚洲欧美中文另类| 欧美1区2区视频| 久久久久久精| 欧美日韩亚洲综合| 免费成年人欧美视频| 国产精品盗摄久久久| 亚洲电影免费在线| 国产一区二区欧美日韩| 99国产成+人+综合+亚洲欧美| 在线观看不卡| 亚洲综合视频一区| 夜色激情一区二区| 老鸭窝91久久精品色噜噜导演| 欧美在线亚洲|