加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

用WebService实现类XmlRpc远程调用

发布时间:2020-12-17 02:07:36 所属栏目:安全 来源:网络整理
导读:????? 远程调用对一些不需要实时数据的地方可以考虑用WebService或者xmlrpc,而不采用socket,比如获取配置项信息等. 最近和我同事商讨,总结了一套可以应付各种需求的远程调用方法,并且实现了。好东西,大家共分享: ? ??? web service 报文协议 描述 采用

????? 远程调用对一些不需要实时数据的地方可以考虑用WebService或者xmlrpc,而不采用socket,比如获取配置项信息等. 最近和我同事商讨,总结了一套可以应付各种需求的远程调用方法,并且实现了。好东西,大家共分享:

?

???

web service报文协议

描述

采用xml格式进行数据交互

协议

请求报文

<?xml version="1.0" encoding = "UTF-8"?>

<aot>

?????? <method>tribe.gettribe</method>

?????? <callid></callid>

<token>123456789</token>

?????? <param>

????????????? <p>60000018</p>

????????????? <p>fantaotao</p>

?????? </param>

</aot>

?

字段

含义

说明

aot

xml根节点

?

method

远过程名

?

callid

调用标识

1.?????? 值可为空

2.?????? web端必须原样返回该字段值

token

登录令牌

1.?????? 值可为空(在TATA未登时可为空)

2.?????? TATA登录后会取得该令牌

param

参数集

3.?????? 没有参数,该结点可没有

4.?????? 该节点下的子节点,都用来描述具体的参数内容

5.?????? 参数必须保证顺序

p

描述具体某个参数

1.? 参数必须保证顺序

?

应答报文

<?xml version="1.0" encoding = "UTF-8"?>

<aot>

?????? <ret>0</ret>

?????? <msg>操作成功</msg>

??? <callid>调用标识</callid>

<token>登录令牌为GUID</token>

?????? <recordset>

????????????? <recordcount>记录总数</recordcount>

????????????? <pagesize>一页显示记录数</pagesize>

????????????? <record>

???????????????????? <id>1001</id>

???????????????????? <name>黑手党</name>

???????????????????? <members>200<members>

????????????? </record>

????????????? <record>

???????????????????? <id>1002</id>

???????????????????? <name>美女群</name>

???????????????????? <members>120<members>

????????????? </record>

?????? </recordset>

</aot>

?

字段

含义

说明

aot

xml根节点

?

ret

操作结果(数字)

1.?????? =0: 操作成功

2.?????? !=0: 失败,msg字段描述具体失败原因

msg

操作结果描述

可为空,描述具体操作的结果信息

callid

调用标识

1. 原样返回请求报文中的callid字段

recordset

记录集

1.?????? 返回的操作结果集

2.?????? 可为空

recordcount

记录总数

可为空

recordsize

一页显示记录数

可为空

record

表示一个记录

?

?

C++ 接口设计:

?

?

??? class ipacket;

??? class ievent_handler
??? {
??? public:
??????? virtual void on_recv(ipacket* _pack) = 0;
??? };

?

??? class ipacket : public aot::tt::interface_base
??? {
??? protected:
??????? virtual ~ipacket(){;}?
??? public:
??????? virtual bool query_interface(void** out,const char* key){return false;}
??????? virtual const char* interface_name(){return "ipacket";}?

??? public:
??????? virtual void set_event_handler(ievent_handler* pHandler) = 0;
??????? virtual ievent_handler* get_event_handler() = 0;
??? public:?
??????? //参数操作
??????? virtual void set_method(const char* method) = 0;
??????? virtual void set_call_id(const char* call_id) = 0;
??????? virtual void set_token(const char* token) = 0;
??????? virtual void push_back(const char* key,const char* value) = 0;
????????
??????? virtual bool get_params(aot::tt::istr** out) = 0; // 获取发出去的参数报文

??? public:
??????? // 结果操作
??????? virtual int get_ret_code() = 0;?? //WebService调用结果,1 成功 其他失败
??????? virtual void set_result(const char* result) = 0; // 设置原始的返回报文并且解析
??????? virtual bool get_result(aot::tt::istr** out) = 0; // 获取返回的原始的报文
???????
??????? virtual bool is_valid() = 0; //返回的xml是否有效

??????? virtual int? get_ret_result_code() = 0; // 返回的报文中的ret 值
??????? virtual bool get_ret_result_msg(aot::tt::istr** out) = 0; //返回的报文中的msg 值

??????? /************************ recordset op ******************/
??????? /************************ begin *************************/
??????? //必须先调用get_recordset_count,然后才可调用其它recordset操作函数
??????? virtual long get_recordset_count() = 0;
??????? virtual bool goto_first_recordset() = 0;
??????? virtual bool goto_next_recordset() = 0;
??????? virtual bool goto_recordset(int n=1) = 0;
??????? virtual int? get_recordset_recordcount() = 0;? // 获取recordset 报文 中的 recordcount
??????? virtual int? get_recordset_pagesize() = 0;??? // 获取recordset 报文 中的 pagesize

??????? /************************ recordset op ******************/
??????? /************************ end *************************/

??????? /************************ record op *********************/
??????? /************************ begin *************************/
??????? //必须先调用get_record_count,然后才可调用其它record操作函数
??????? virtual long get_record_count() = 0;
??????? virtual bool goto_first_record() = 0;
??????? virtual bool goto_next_record() = 0;
??????? virtual bool goto_record(int n=1) = 0;
??????? virtual bool get_record_raw_str(aot::tt::istr** out) = 0; //获取record的原始报文
??????? virtual bool get_value(const char* key,aot::tt::istr** out,const char* default="") = 0;
??????? virtual int get_value_int(const char* key,int default = 0) = 0;
??????? /************************ record op *********************/
??????? /************************ end ***************************/

???????
???????
??? };

???

??? class iwebRpc : public aot::tt::interface_base
??? {
??? protected:
??????? virtual ~iwebRpc(){;}?
??? public:
??????? virtual bool query_interface(void** out,const char* key){return false;}
??????? virtual const char* interface_name(){return "iwebRpc";}?

??? public:
??????? virtual bool set_root_url(const char* szUrl) = 0;
???????


??????? /************************ 通用WebService处理 *********************/

??????? virtual bool sy_post_packet(ipacket* _pack) = 0;

??????? /*??????????? pPack 必须绑定一个 ievent_handler 的事件处理器,并且必须在事件处理中把pPack 释放掉??????? */??????? virtual bool asy_post_packet(ipacket* pPack) = 0;???? ??????? /************************ 通用WebService处理 结束 *********************/??? };

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读