使用 Classic ASP/ 创建服务器端 REST API 时遇到问题/
Posted
技术标签:
【中文标题】使用 Classic ASP/ 创建服务器端 REST API 时遇到问题/【英文标题】:Having a problem while creating a server-side REST API using Classic ASP/ 【发布时间】:2022-01-10 19:40:30 【问题描述】:虽然没有详细说明在用 VBScript 编写的 Rest API 的服务器端发生了什么,但有一篇文章解决了这个问题:Can I build a REST application using ASP Classic?。 该帖子的大部分内容描述了有关 JSON 字符串化以及从数据库获取数据的各种问题。我的问题与这些都不相关。但是忽略这些(以及一些语法错误),那篇文章中几乎没有其他内容。
所以,我承认在服务器端行为方面我是个新手。但是当我从上述帖子中删除所有内容时,我只剩下几行代码,它们似乎只是请求输入值然后输出字符串。所以我想知道这是否确实是准系统 I/O 所涉及的全部内容(即,忽略安全和格式问题)。我决定试试这个。我的结果令人费解。当我调用这个极其简单的 API 时,我并没有接收到正在发送的非常简单的 JSON 字符串,而是取回了包含 API 的整个源代码,从打开的 html 标记到它的关闭。我显然犯了一个非常根本的错误。
这是我的代码。首先,这是非常简单的 REST API 本身(请注意:这只是写回一个人工 JSON 字符串。它甚至与接收 POST 参数无关。)这是“simplerest.asp”
<html>
<head>
</head>
<body>
<%
Response.Write("" & Chr(34) & "SomeCert" & Chr(34) & ":" & Chr(34) & "12345"& Chr(34) & "")
%>
</body>
</html>
这里是调用这个“API”(testrest.asp)的代码(使用jQuery):
<html>
<head>
<script type="text/javascript" src="/./include/jquery-3.4.1.min.js"></script>
</head>
<body>
<script type="text/javascript">
function getCert(certNumber)
var settings =
"async": true,
"crossDomain": true,
"url": "example.com/simplerest.asp",
"method": "GET",
"success": function (response)
alert("success");
,
"headers":
"Accept": "application/json"
$.ajax(settings).done(function (response)
certvals = response;
alert("certvals is " + certvals);
);
getCert("dummy");
</script>
</body>
</html>
如上所述,当我运行调用逻辑时,certvals
中返回的是整个“API”代码的精确 ASCII 表示。本着我正在尝试的精神,即看到 API 以最基本的模式运行,有人能告诉我我犯了什么愚蠢的错误吗?
【问题讨论】:
如果输出显示的是asp代码而不是输出,则需要先启用asp。请参阅:My ASP classic site is rendering the code instead of the output, how can I fix it?。此外,如果您以 json 字符串形式给出响应,则不需要页面中的所有标签,只需服务器标签中的代码. 您在 HTML 页面中输出 JSON。如果您希望从服务器返回原始 JSON,请删除 HTML,并通过在Response.Write
之前设置 Response.ContentType = "application/json"
让客户端知道您正在发送 JSON。
@Flakes。谢谢你。删除无关的 html 确实只返回字符串。但我无法解析它。如果我遵循 user692942 的建议,我将不再从 ajax 调用中获得成功,但如果我只是按照你说的做,我将无法解析结果。换句话说,response["SomeCert"] 返回未定义。所以问题是,为什么Response.ContentType = "application/json"
在这里不起作用? (我在 [***.com/questions/6977261/… 找到了一个相关点的讨论,但它似乎不适用于这里。
是的,Classic ASP 已安装在服务器上。许多 .asp 页面正在运行。只是不是这个创建 REST API 的实验。
@roricka 检查是否有任何控制台错误。还要在 response.write 行之后添加一个Response.End
。我记得前一段时间你不这样做时看到了一个问题。添加Response.ContentType = "application/json"
是正确的方法,正如@user692942 所说(你的js 代码也有"Accept": "application/json"
)。当我执行alert("certvals is " + certvals.SomeCert);
时,我得到了 12345 的值
【参考方案1】:
Assuming you have Classic ASP installed 并在您的网站 (IIS) 中启用,使用;
<%
'Tell client you are sending JSON
Response.ContentType = "application/json"
Call Response.Write("""SomeCert"":""12345""")
%>
因为您将 JSON 封装在 HTML 结构中,所以它只是在 HTML 页面中作为字符串输出。
此外,当您可以通过加倍来转义字符串中的双引号时,就不需要Chr(34)
。
关于 to the comments,这是一个使用本地 IIS 实例测试的完整工作示例。
<html>
<head>
<title></title>
</head>
<body>
<button id="buttonSend">Send</button>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>
<script>
$("#buttonSend").on("click", function()
getCert("dummy");
);
function getCert(certNumber)
var settings =
"async": true,
"crossDomain": true,
"url": "example.com/simplerest.asp",
"method": "GET",
"success": function (response)
alert("success");
$.ajax(settings).done(function (response)
certvals = response;
alert("certvals is " + certvals.SomeCert);
);
</script>
</body>
</html>
输出(两条消息):
success
certval is 12345
有用的链接
How to guide for getting a classic asp application working under IIS 7.0 ASP Classic setup issues I have already enabled classic asp support on IIS for windows 7, and configured IIS web for classic asp,Yet .asp page is not being displayed? About using Double quotes in Vbscript (解释如何在 VBScript 中转义双引号)【讨论】:
谢谢你,这行得通。 (但脚本标签不应该在 或 内部吗?)最终,我的错误是包含了接受标头。一旦我删除了原始代码的工作原理,尽管没有一些人添加的一些细节。非常感谢。 @roricka 是的,他们应该会纠正这一点。很高兴它很有用。以上是关于使用 Classic ASP/ 创建服务器端 REST API 时遇到问题/的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET Classic 不使用 WebForm_PostBackOptions 的默认选项创建按钮回发
IIS7 上的 ASP Classic 无法创建 COM 对象