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

实战WebService I: XML-PRC篇(基于php)

发布时间:2020-12-17 01:10:46 所属栏目:安全 来源:网络整理
导读:XML-RPC是一种简单的,轻量级的通过HTTP协议进行RPC通信的规范。一个XML-RPC消息就是一个请求体为XML的HTTP-POST请求,被调用的方法在服务器端执行并将执行结果以XML格式编码后返回。 XML-RPC 和SOAP是创建web services的两种标准协议。XML-RPC是出现较早的(
XML-RPC是一种简单的,轻量级的通过HTTP协议进行RPC通信的规范。一个XML-RPC消息就是一个请求体为XML的HTTP-POST请求,被调用的方法在服务器端执行并将执行结果以XML格式编码后返回。 XML-RPC 和SOAP是创建web services的两种标准协议。XML-RPC是出现较早的(也比较简单),而SOAP较新,也比较复杂。Microsoft的.NET就是基于 SOAP,而很多流行的WEB程序,如Frontier和blogger,则提供XML-RPC接口。?

PHP通过xmlrpc扩展提供SOAP和XML-RPC的访问途径。xmlrpc基于xmlrpc-epi项目(更多信息请查看http://xmlrpc-epi.sourceforge.net)。xmlrpc扩展默认是不可用的,你需要在编译PHP时加上–with-xmlrpc选项来启用该扩展。?

以下是通过ethereal抓到的一个典型的XML-RPC调用包(为便于阅读,进行了格式化):?

1. 请求报文格式?
Java代码??

收藏代码

  1. POST?/xmlrpc?HTTP/1.1??
  2. Content-Type:?text/xml??
  3. User-Agent:?Apache?XML?RPC?3.0?(Jakarta?Commons?httpclient?Transport)??
  4. Host:?135.252.156.147:8080??
  5. Content-Length:?260??
  6. <?xml?version="1.0"?encoding="UTF-8"?>??
  7. <methodCall?xmlns:ex="http://ws.apache.org/xmlrpc/namespaces/extensions">??
  8. ??????<methodName>Calculator.add</methodName>??
  9. ??????<params>??
  10. ????????????<param>??
  11. ??????????????????<value>??
  12. ????????????????????????<i4>2</i4>??
  13. ??????????????????</value>??
  14. ????????????</param>??
  15. 3</i4>??
  16. ??????</params>??
  17. </methodCall>??


2. 报文返回格式?

而对应的返回数据包为:?

HTTP/1.1?200?OK??
  • Server:?Apache?XML-RPC?1.0??
  • Connection:?close??
  • 189??
  • <methodResponse?xmlns:ex="http://ws.apache.org/xmlrpc/namespaces/extensions">??
  • 5</i4>??
  • </methodResponse>??


  • 其格式很简单,几乎是不言自明的,分别用methodCall和methodResponse标签标识发送给Server的调用请求和Server的返回结果,请求方法的名称用methodName标识,参数用params和param标识,而参数的类型标签则如下表所示:?

    示例?

    XML-RPC需要PECL扩展支持,在Windows下,对应的dll文件是:php_xmlrpc.dll?
    写一个XML-RPC服务器?

    Java代码??

    收藏代码

      <?php??
    1. ?//该函数暴露给客名端的名称为“multiply(?)”??
    2. ?function?times?($method,?$args)?{??
    3. ???return?$args[0]?*?$args[1];??
    4. ?}??
    5. ?$request?=?$HTTP_RAW_POST_DATA;??
    6. ?if?(!$request)?$request_xml?=?$HTTP_POST_VARS['xml'];??
    7. ???
    8. ?$server?=?xmlrpc_server_create(??);??
    9. if?(!$server)?die("Couldn't?create?server");??
    10. ?xmlrpc_server_register_method($server,?'multiply',?'times');??
    11. ?$options?=?array('output_type'?=>?'xml',?'version'?=>?'auto');??
    12. ?echo?xmlrpc_server_call_method($server,?$request,?null,?$options);??
    13. ?xmlrpc_server_destroy($server);??
    14. ?>??


    客户端?

    XML-RPC客户端的主要工作是发出HTTP请求和解析服务器发回的响应。PHP所带的xmlrpc扩展可以将XML-RPC请求用XML编码,但它不知道如何发送HTTP请求。如果要具有这样的功能,可以从http://xmlrpc-epi.sourceforge.net下载xmlrpc-epi程序包,然后安装其中的sample/utils/utils.php文件。该文件包含一个可以执行HTTP请求的函数。?

    ??require_once('utils.php');??
  • ??$options?=?array('output_type'?=>?'xml',?'version'?=>?'xmlrpc');??
  • ??$result?=?xu_rpc_http_concise(??
  • ????array(method??=>?'multiply',??
  • ??????????args?????=>?array(9,?6),250); line-height:18px"> ??????????host?????=>?'localhost',250); line-height:18px"> ??????????uri??????=>?'/php/rpc_webservice/xmlrpc_server.php',250); line-height:18px"> ??????????options?=>?$options)??
  • ??);??
  • ??//echo?$result;??
  • ??echo?"9?*?6?is?$result";??
  • ?>??


  • 还有一些XML-RPC特性这里未提及,如XML-RPC的数据类型并不总是与PHP的数据类型精确对应,但可以将这些值编码成特殊的数据类型而不采用 xmlrpc扩展通过最佳猜测选择的数据类型。当然,PHP的xmlrpc扩展的一些特性我们也没有介绍,如SOAP错误。想知道全部细节,请查看http://www.php.net,上面有xmlrpc扩展的详细文档。?



    转载于:http://www.iteye.com/topic/152040

    (编辑:李大同)

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

      推荐文章
        热点阅读