使用xmlhttp的经典ASP页面能否发出JSON请求?

使用xmlhttp的经典ASP页面能否发出JSON请求?,json,asp-classic,xmlhttprequest,Json,Asp Classic,Xmlhttprequest,我完全迷路了。我试图从使用vbscript的经典asp页面发布到远程服务器上的API。我的代码: set xmlhttp = CreateObject("MSXML2.ServerXMLHTTP") xmlhttp.open "POST", vURL, false xmlhttp.setRequestHeader "Content-type","application/json" xmlhttp.setRequestHeader "Accept","application/json" xml

我完全迷路了。我试图从使用vbscript的经典asp页面发布到远程服务器上的API。我的代码:

set xmlhttp = CreateObject("MSXML2.ServerXMLHTTP") 
xmlhttp.open "POST", vURL, false 
xmlhttp.setRequestHeader "Content-type","application/json"
xmlhttp.setRequestHeader "Accept","application/json"
xmlhttp.send "email=asdf@hotmail.com&firstname=joe&lastname=smith"
vAnswer = xmlhttp.responseText  

我收到一个响应,表明请求不是预期的格式。技术支持人员告诉我,API希望post正文中包含JSON。我可以从服务器端asp执行此操作吗?

请检查此项,它将帮助您完成所需的操作:


祝你好运

您发送的请求是。。。。。不是JSON。尝试将此用作验证程序:。将JSON字符串放入其中,它将告诉您它是否有效。在上述情况下:
电子邮件=asdf@hotmail.com&firstname=joe&lastname=smith
。绝对不是

您可以手工编写JSON,例如,我将按照以下方式重写您的查询:

{“电子邮件”:asdf@hotmail.com“,”姓氏“:”乔“,”姓氏“:”史密斯“}

我希望这有帮助。是的,有一些库可以帮助您做到这一点(ASPJSON就是其中之一),但老实说,我更喜欢自己编写它们(ASP非常笨拙),或者编写自己的函数,因为我知道我可以信任它们。下面是我在ASP中编写的一段示例代码,它可以从Dictionary对象生成JSON字符串。它还可以在字典元素中包含数组。不幸的是,它不是递归的,所以它不能做数组的数组或字典的字典。。。但对于简单的输入,它工作得很好。在PHP函数之后命名为json_encode

Function json_encode(ByVal dic)
    ret = "{"
    If TypeName(dic) = "Dictionary" Then
        For each k in dic
            Select Case VarType(dic.Item(k))
                Case vbString
                    ret = ret & """" & k & """:""" & dic.Item(k) & ""","
                Case Else
                    If VarType(dic.Item(k)) > vbArray Then
                        ret = ret & """" & k & """:["
                        For x = 0 to Ubound(dic.Item(k), 1)
                            ret = ret & """" & dic.Item(k)(x) & ""","
                        Next
                        ret = Left(ret, Len(ret) - 1)   'Trim trailing comma
                        ret = ret & "],"
                    Else
                        ret = ret & """" & k & """:""" & dic.Item(k) & ""","
                    End If
            End Select
        Next
        ret = Left(ret, Len(ret) - 1)   'Trim trailing comma
    End If
    ret = ret & "}"
    json_encode = ret
End Function

因为我在试图有效地解决同样的问题时遇到了这个问题——在我的例子中,从ASP Classic发布到MailChimp 2.0 API——我想回应链接的有用性,但也注意到一些至少与MailChimp相关的东西。我以为我可以简单地格式化一个JSON格式的字符串并发送它,但它不起作用。我必须使用aspjson库中的方法创建一个JSON对象,然后在send语句中使用jsString方法。因此代码片段(在适当的声明、include等之后)将如下所示:

Set objJSON = jsObject()
objJSON("apikey") = "MY API KEY"
Set objJSON("email") = jsObject()
objJSON("email")("email") = strEmail
Set objXMLhttp = Server.Createobject("MSXML2.ServerXMLHTTP")
objXMLhttp.open "POST","https://mailchimpurl/2.0/helper/lists-for-email", false
objXMLhttp.setRequestHeader "Content-type","application/json"
objXMLhttp.setRequestHeader "Accept","application/json"
objXMLhttp.send objJSON.jsString
strResponse = objXMLhttp.responseText
Set objXMLhttp = Nothing

希望这对其他人有所帮助。

Bugget,我之前下载过,但我不知道如何使用它格式化JSON请求。我将再看一看。@user1048348这正是它在查看Wiki页面中的示例时所做的。然而,如果您为OP提供了一小部分代码样本,而不仅仅是一个链接,那么您的答案可能会更有帮助。这是无效的,它应该是大括号,例如{“Email”:asdf@hotmail.com,“firstname”:“joe”,“lastname”:“smith”}请通过将代码缩进4个空格来改进格式。
'Create a function
Function ASPPostJSON(url)

'declare a variable
Dim objXmlHttp

Set objXmlHttp = Server.CreateObject("Microsoft.XMLHTTP")

'If the API needs userName and Password authentication then pass the values here
objXmlHttp.Open "POST", url, False, "User123", "pass123"
objXmlHttp.SetRequestHeader "Content-Type", "application/json"
objXmlHttp.SetRequestHeader "User-Agent", "ASP/3.0"

'send the json string to the API server
objXmlHttp.Send "{""TestId"": 012345,""Test1Id"": 123456,""Test123"": 37,""Type123"": ""Test_String"",""contact"": {""name"": ""FirstName LastName"",""Organization"": ""XYZ"",""phone"":""123456"",""emailAddress"": ""test@mail.com""}}"

'If objXmlHttp.Status = 200 Then
    ASPPostJSON = CStr(objXmlHttp.ResponseText)
'end if

'return the response from the API server
Response.write(ASPPostJSON)
Set objXmlHttp = Nothing

End Function

'call the function and pass the API URL
call ASPPostJSON("https://TheAPIUrl.com/")