【发布时间】: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"在这里不起作用? (我在 [stackoverflow.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 的值
标签: api rest vbscript asp-classic