服务端以XML的格式将值返回给客户端(二)

        我在网上百了一下以XML返回值的信息,一个叫XML-RPC东东让我眼前一亮。到底这个XML-RPC东东是什么呢?baidu上讲的是:

        xml-rpc协议 是一套规范及其一系列的实现,允许运行在不同操作系统、不同环境的程序基于internet进行远程过程调用。
  这种远程过程调用使用http作为传输协议,xml作为传送信息的编码格式。Xml-Rpc的定义尽可能的保持了简单,但同时能够传送、处理、返回复杂的数据结构。

  Xml-rpc是工作在internet上的远程过程调用协议。一个xml-rpc消息就是一个请求体为xml的http-post请求,被调用的方法在服务器端执行并将执行结果以xml格式编码后返回。

       很深奥很强大,先从它的请求和应答看起吧!

       XML-RPC请求的例子:

POST  / RPC2 HTTP / 1.0
User
- Agent: Frontier / 5.1 . 2  (WinNT)
Host: betty.userland.com
Content
- Type: text / xml
Content
- length:  181

<? xml version = " 1.0 " ?>
< methodCall >
     
< methodName < examples.getStateName </ methodName >
     
< params >
             
< param >
                      
< value > i4 </ value >
               
</ param >
       
</ params >
</ methodCall >

      XML-RPC应答的列子

 

HTTP / 1.1   200  OK
Connection: close
Content
- Length:  158
Content
- Type: text / xml
Date: Fri, 
17  Jul  1998   19 : 55 : 08  GMT
Server: UserLand Frontier
/ 5.1 . 2 - WinNT

<? xml version = " 1.0 " ?>
< methodResponse >
     
< params >
           
< param >
                   
< value >< string > South Dakota </ string ></ value >
           
</ param >
     
</ params >
</ methodResponse >

       以下就是上一章通过抓包获得请求和应答的例子:

       页面模拟客户端向服务端post信息的请求:

 

POST /yuanjie/CreateCustandEPByWeb.aspx HTTP/1.1 "
Request Method: POST
Request URI: /yuanjie/CreateCustandEPByWeb.aspx
Request Version: HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; zh-cn) Opera 8.54
Host: 192.168.0.46
Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
Accept-Language: zh-cn,en;q=0.9
Accept-Charset: gbk, utf-8, utf-16, iso-8859-1;q=0.6, *;q=0.1
Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0
Connection: Keep-Alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 152

button=tijiao
&key = &v_loginname = &v_password = &v_email = &v_endpointno = &v_CF_Question = &v_CF_Answer = &v_address = &v_fixedphone = &v_cellphone = &v_city = &v_country =

       第一段是请求的head,第二段是请求的body,所需要post的字段。下面是应答的例子:

Request Version: HTTP/1.1
Response Code: 200
Date: Wed, 23 Apr 2008 08:40:12 GMT
Server: Microsoft-IIS/6.0
MicrosoftOfficeWebServer: 5.0_Pub
X-Powered-By: ASP.NET
X-AspNet-Version: 1.1.4322
Set-Cookie: ASP.NET_SessionId=daus5j2ydc3aoy55q5niul55; path=/
Content-Type: text/html; charset=utf-8
Content-Length: 121

<? xml version="1.0" encoding = "GB2312" ?> < register >< result  v_return  ='-9'  v_endpointno  ='-1'  v_loginname =''  /></ register >

      上图中返回的是一个XML形式的字符串,但是客户端收的却是XML文件,这我就不太明白了。XML-RPC的例子与我这个例子最大的不同的是XML-RPC请求的格式也是XML,而我这个请求是字符串(其实我应答的返回也是个字符串,不够样子象个XML罢了)。还有head中的Content-Type也不一样:一个是text/xml,另一个是text/html。目前来说,我只是大致上知道XML-RPC到底是个什么东东,其有什么优越性还不知道。但是就我这个例子而言,其优点太少,而缺点却很多。

       优点:客户端的朋友说只要通过C++的XML类就能解析XML,这样接受数据方面不易出错而且简单。XML可以满足大多数的客户端的要求。

       但缺点是服务端就更加容易出错了,而确很麻烦。例如:

 

Result = " <?xml version="1.0" encoding = "GB2312"?> " ;
Result
+= " <result v_return = " + v_return + " > " ;
                                                         Result
+= " <balance type =  " + CurrencyType + " > " + balance1.ToString( " 0.0000 " ) + " </balance> " ;
Result
+= " </result> " ;

//上面的是因为字符串太长,编辑器自动换行。


Result
= " <?xml version="1.0" encoding = "GB2312"?> " ;
Result
+= " <result v_return = " + v_return + " > " ;
Result
+= " <balance type =  " + CurrencyType + " > " + balance1.ToString( " 0.0000 " )
        
+ " </balance> " ;
Result
+= " </result> " ;

  // 上面的是因为我觉得字符串太长,人为的回车换行。

Result="<  ?xml version="1.0" encoding = "GB2312"?> ";
Result
+="<result v_return ="+v_return+"> ";
Result
+="<   balance type = "+CurrencyType+">"+balance1.ToString("0.0000")+"</balance> ";
Result
+="< /result>";

//以上是人为的空格,当XML的行数很多时,这种空格就很难查出来



      按照上面的第一段的代码返回的字符串,客户端是可以按照XML解析的,但是后面两段的字符串使不能被客户端按照XML解析的。而这三段代码在VS中编译都正确的,而通过抓包工具抓包得到返回的值看起来都是符合要求,因为空格很难看出来,而回车则不显示。这往往很让人郁闷。

     有的XML格式可以用IE显示出来而且客户端也能解析,但有的XML在IE不能正常显示但是客户端也能解析,这就无法判断XML的格式是否正确。每次测试起来就十分痛苦,错的原因也是莫名其妙。

     这都是图简单惹的祸,早知道是这样还是用.NET的XML类来定义好属性和节点,让XML类自动将XML输出出来,这样可以少多少事啊!

     即使我能通过XML类完整无误的将XML返回给客户端,我觉得也只是将这种方式做到了形象而神不象,结果是画虎不成反类犬啊! 还是要弄清其中的奥妙啊----要做到形神合一,天下无敌!

      不知道XML-RPC是不是我要“研究”的方向----但是还是要试试看!

 

 

 


        

你可能感兴趣的:(数据结构,xml,Opera,asp.net,internet,encoding)