前面博主有一篇文章讲述了ASP如何调用Delphi开发的WebService服务,见:http://blog.csdn.net/xieyunc/article/details/57129936
日前,见有网友留言提问如何调用Delphi开发的DataSnap/Restful接口服务,在此特写一篇文章算是作一统一回复吧。尽管此文是使用ASP调用Delphi开发的DataSnap/Restful接口服务,但对其它语言编写的DataSnap/Restful接口服务,或者用其他脚本语言如PHP、ASP.NET调用同样适用。
本例中使用了博主开发的一个电控接口服务程序,其中有一个接口函数是获取校区信息的,其原型为:
//获取接口服务器所在的校区信息,KeyNumber为通讯密钥,如何密钥验证失败,返回-1
function GetXQList(const KeyNumber:string):string;
本例的校区信息表中有一条记录:
RestfulSrv.asp文件:
<%
Dim WebSrv,WebSrvUrl,KeyNumber
WebSrv="localhost:8019" '提供RESTful服务的服务器,格式:IP:Port
'WebSrvUrl="http://"&WebSrv&"/peci/rest/TServerMethods/GetXQList/密钥字符串" '必须是绝对地址,不能是相对地址,这一点与WebService不一样。
WebSrvUrl="http://"&WebSrv&"/peci/rest/TServerMethods/" '必须是绝对地址,不能是相对地址,这一点与WebService不一样。
KeyNumber="91F11212729292F2136DADEAE457CEBD3656B6CECECECD3145474855B6aAA" '//KeyNumber为通讯密钥字符串,作为函数的参数传递
Function GetXQList(sResult)
'GetXQList函数返回校区信息,返回的信息是一个表数据,但是在输出时已转化为JSON格式,数组形式,其原型为:
'//获取接口服务器所在的校区信息
'function GetXQList(const KeyNumber:string):string;//KeyNumber为通讯密钥字符串
Set xmlhttp = server.CreateObject("Msxml2.XMLHTTP")
sUrl=WebSrvUrl&"GetXQList"&"/"&KeyNumber '必须是绝对地址,不能是相对地址,这一点与WebService不一样。
xmlhttp.Open "GET",sUrl,false
xmlhttp.setRequestHeader "HOST",WebSrv
xmlhttp.setRequestHeader "Content-Type", "text/xml;charset='utf-8'"
xmlhttp.SetRequestHeader "Content-Type", "application/x-www-form-urlencoded"
xmlhttp.setRequestHeader "User-Agent", "CodeGear SOAP 1.3"
xmlhttp.setRequestHeader "Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
xmlhttp.setRequestHeader "Accept-Language","utf-8;zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3"
xmlhttp.setRequestHeader "Accept-Encoding","gzip, deflate"
xmlhttp.setRequestHeader "Connection","keep-alive"
xmlhttp.setRequestHeader "Cache-Control", "no-Cache"
xmlhttp.Send(null)
'Response.Write sUrl
'Response.Write xmlhttp.Status&"|"&xmlhttp.StatusText&"<br />"
'Response.Write xmlhttp.responsetext
'Response.End()
If xmlhttp.Status = 200 Then
GetXQList="true"
sResult=xmlhttp.ResponseText
Else
GetXQList="false"
'Response.Write xmlhttp.Status&" "
sResult=xmlhttp.StatusText
End if
Set xmlhttp = Nothing
End Function
%>
其中最关键是如何获取获取完整的请求头信息,因在XE中已经没有了Delphi2007及之前版本中很方便进行WEB调试的工具---【Web App Debug】,故找了一个网络抓包工具获取完整的网页请求头信息,我使用的抓包工具是【HTTP Analyzer】,当然也可以直接使用FireFox浏览器的Debug功能--查看元素,在浏览器地址栏中直接输入如下信息:http://localhost:8019/peci/rest/TServerMethods/GetXQList/密钥字符串
从上图中可以看到Restful接口服务执行成功并返回了正确的结果,此时在Firefox调试环境中可以看到此页面的请求头,如下图:
但是这个请求头并不完整,因为缺少了一项Request-Line的内容,导致我不知道如何构建Open语句,而这一点,在【HTTP Analyzer】工具中就非常清楚,其实Request-Line的内容就是xmlhttp.Open中需要的请求地址,且必须是绝对地址,本来Request-Line=URL-HOST,但是在Restful的请求头中Resquest-Line必须是URL的完整内容即绝对地址,当然如果知道URL、HOST和Request-Line之间的关系之后,【HTTP Analyzer】工具也就可有可无了,如下图:
<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<%Session.CodePage=65001%>
<%Response.charset="utf-8"%>
<!-- #include file="restfulsrv.asp"-->
<%
Dim sStatus,sResult
sResult = ""
Response.Write "执行<br />"
Response.Write "sStatus=GetXQList(sResult)"
Response.Write "<br />结果:<hr />"
sStatus=GetXQList(sResult)
Response.write "sStatus="&sStatus&"<br />"
If sStatus="true" Then
Response.write "执行成功!返回结果为:<br />"&sResult
else
Response.write "执行失败!返回结果为:<br />"&sResult
End If
%>
Test.asp执行结果为:
密钥不正确时的执行结果:
源代码测试下载:http://download.csdn.net/download/xieyunc/9838759