如何处理发送到 API 的有效负载

How to process the payload send to an API

继续阅读之前:这不是关于如何访问 REST 的问题 API。我不是在询问与端点通信、向其发送有效负载以及解析接收到的 JSON.

相反,我想问的是如何在 vbScript 中设置该端点。端点本身,而不是将要向其发送消息的代码。我的 post 询问如何接收 JSON 负载。我正在编辑这个问题,因为人们有时并没有真正阅读 post,正因为如此,我被告知我需要捍卫我的 post,因为它与其他post 这不一样。呃。如果人们不打算阅读,那我该如何向他们解释?

无论如何,自从我制作了原版 post 以来,确实有人解决了我的问题。下面是 @user692942,他写道(证实了我的怀疑)如果我想在 vbScript 中这样做,我将不得不使用 Request.BinaryRead,然后 posted 一个实际相关的 link(我在搜索中遗漏了它),它讨论了一些可以使用 Request.BinaryRead 的方法。但是对于那些想阅读我的原创的人来说 post:

在 vbScript 中,我正在尝试编写一个 REST API,它传递一个 JSON 有效负载(然后解析它,然后它做任何它需要做的事情,然后用结果 JSON 响应=31=] 字符串)。我已经让输出部分工作了,但我意识到我在输入端犯了一个根本性的错误。我写它是为了接收标准的 POSTed 字段,而不是 JSON 字符串。当我 google 这个问题时,我所能找到的只是如何解析从端点返回的 JSON,而不是如何创建端点 api 本身,以及如何正确写入端点抓取有效载荷。

因此,我用两个简单的请求开始 api 代码:

email = Request.Form("email")
password = Request.Form("userpassword")

显然这是错误的,因为我没有接收现场数据,而是试图获取 JSON 有效负载。我该如何编写才能正确输入有效负载。 (我知道如何进行 JSON 解析,但我无法获得 JSON 字符串!)我意识到这是一个愚蠢的问题,但有人能告诉我这是什么显而易见的事情吗我不见了?谢谢

REST API 与仅“调用”REST API 的软件有很大区别。以下是一种仅使用 vbScript 创建 REST API 本身的方法。此 API 可以驻留在以 myrestapi.asp 结尾的 url 处。当一些其他程序调用您的“端点”并发送 GET 或 POST 请求时,您可以在您的服务器上执行任意数量的有趣任务,特别是在 returning 任何它之前与您的 MSSQL 数据库交互将被 returned,作为 JSON 字符串。 (然后,由您的对话者通过解析 JSON 来找出您的答案。-但我强调,该任务不是此 post 的重点。)

以下内容依赖于完全免费的 ASPJSON 解析器(Response.LCID = 1033)。

它还简要展示了 Window 的 command-line curl 到 运行 测试的使用。

vbScript 的一个问题是它太老了,人们认为“api-related”问题一定意味着您正在使用 vbScript 将命令发送到终点并在 JSON,许多人询问并谈论如何做到这一点。

但也可以(正如我最近发现的那样)创建端点 THEMSELVES。不同之处在于,当您仅访问 API 时,您始终在处理结构化数据。当您是 API 时,如果传入的数据是 JSON 字符串,则它是非结构化的。它不是 name-value 对的一部分。

但是,只需要很少的工作,就可以只使用 vbScript 构建这样一个软件。 api 读取其 Request 对象,以一种可以轻松转换为标准 vbscript 字符串的格式引入原始二进制数据。此时,将调用 JSON 解析器,其结果是附加到 vbScript 对象的 JSON 字段。检索语法非常简洁。这是一个使用电子邮件和密码登录的非常简单的示例。

Dim tb,br,i,s,jsonObj,incomingParams,email,password,status
tb = Request.TotalBytes
br = Request.BinaryRead(tb)
s = ""

For i = 1 To tb
    s = s & Chr(AscB(MidB(br, i, 1)))
Next
' s now contains JSON input
Set jsonObj = New JSONobject ' see note above
Set incomingParams = jsonObj.parse(s)
email = incomingParams("useremail")
password = incomingParams("userpassword")
status = checkEmail email,password ' pre-canned verification function
If status = "good" Then
    key = getKey ' precanned routine to get random unique key
    jout = "{""loginstatus"":""" & status & """,""loginkey"":""" & key & """}"
Else
    key = 0
    jout = "{""loginstatus"":""1""}"
End If
Response.ContentType = "application/json"
Response.Write(jout)

就是这样。要尝试这个,打开 Windows cmd window 并输入:

curl -d "{\useremail\":\"memberemail@gmail.com\",\]"userpassword\":\"rawpassword\"}" -H Content-Type: application/json" https://www.myserver.com/myrestapi.asp

按 Enter,如果您使用了已接受的 email/password 并且为您正在测试的 API 端点键入了适当的位置,您应该会看到两个 JSON 字段在 return,登录状态,0(良好状态)和随机序列的登录密钥,您的密钥。

现在您拥有了自己的 REST API(某种程度上),它可以扩展以支持全范围的 GET 和 POST。我意识到经典 ASP 缺少很多东西,而且在使用 vbScript 编程时通常可以使用更现代的语言。不过,也可以在 vbScript 中实现某些功能。