【问题标题】:Having a problem while creating a server-side REST API using Classic ASP/使用 Classic ASP/ 创建服务器端 REST API 时遇到问题/
【发布时间】: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


【解决方案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

有用的链接

【讨论】:

  • 谢谢你,这行得通。 (但脚本标签不应该在 或 内部吗?)最终,我的错误是包含了接受标头。一旦我删除了原始代码的工作原理,尽管没有一些人添加的一些细节。非常感谢。
  • @roricka 是的,他们应该会纠正这一点。很高兴它很有用。
猜你喜欢
  • 2019-04-13
  • 1970-01-01
  • 1970-01-01
  • 2021-06-29
  • 1970-01-01
  • 1970-01-01
  • 2019-03-17
  • 1970-01-01
  • 2017-10-30
相关资源
最近更新 更多