ASP如何调用Delphi开发的DataSnap/Restful接口服务

    前面博主有一篇文章讲述了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】工具也就可有可无了,如下图:


Test.asp测试文件:
<%@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


原文地址:https://www.cnblogs.com/xieyunc/p/9126492.html