Может ли классическая ASP-страница с использованием xmlhttp сделать JSON-запрос? - PullRequest
6 голосов
/ 16 ноября 2011

Я полностью потерян. Я пытаюсь опубликовать в API на удаленном сервере с классической страницы ASP, которая использует VBScript. Мой код:

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 ожидает JSON в теле сообщения. Могу ли я сделать это из серверной части ASP?

Ответы [ 4 ]

3 голосов
/ 24 апреля 2015
'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/")
3 голосов
/ 07 июня 2014

Поскольку я столкнулся с этим, когда эффективно пытался решить ту же проблему - в моем случае, POSTing из ASP Classic в API MailChimp 2.0 - я хотел повторить полезность ссылки http://code.google.com/p/aspjson/, но также обратите внимание на то, что было по крайней мере актуально в случае MailChimp. Я думал, что могу просто отформатировать JSON-выглядящую строку и отправить ее, но это не сработало. Мне пришлось создать объект JSON, используя методы из библиотеки aspjson, а затем использовать метод jsString в операторе send. Таким образом, фрагмент кода (после соответствующих объявлений, включений и т. Д.) Будет выглядеть примерно так:

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

Надеюсь, что это поможет кому-то еще в пути.

1 голос
/ 16 ноября 2011

Отправляемый вами запрос ..... не JSON.Попробуйте использовать это как валидатор: JSONLint .Забросьте туда свою строку JSON, и она скажет вам, действительна она или нет.В случае выше: email=asdf@hotmail.com&firstname=joe&lastname=smith.Это определенно не так.

Вы можете написать JSON вручную, например, я бы переписал ваш запрос следующим образом:

{"Email":"asdf@hotmail.com", "firstname":"joe", "lastname":"smith"}

Надеюсь, это поможет.Да, есть библиотеки, которые могут помочь вам в этом (ASPJSON - одна из них), но, если честно, я предпочитаю писать их сам (ASP такой громоздкий) или писать свои собственные функции, потому что я знаю, что могу им доверять.Вот пример кода, который я написал на ASP, который может создать строку JSON из объекта Dictionary.Он также может иметь массивы внутри элементов словаря.К сожалению, он не рекурсивный, поэтому он не может работать с массивами или словарями словарей ... но он работает хорошо для простых входных данных.Назван json_encode после функции PHP.

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
1 голос
/ 16 ноября 2011

Проверьте это, это должно помочь вам сделать то, что вы хотите:

http://code.google.com/p/aspjson/

Удачи!

...