2011-11-15 21 views
5

Estoy completamente perdido. Estoy intentando publicar en una API en un servidor remoto desde una página asp clásica que usa vbscript. Mi código:¿Puede una página ASP clásica utilizando xmlhttp hacer una solicitud JSON?

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

Recibo una respuesta que la solicitud no está en el formato esperado. El soporte técnico me informa que la API espera que JSON esté en el cuerpo de la publicación. ¿Puedo hacer esto desde el servidor asp?

Respuesta

1

mira esto, debe ayudarle a hacer lo que quiere:

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

Buena suerte!

+0

Bugget, he descargado que antes, pero no veo cómo se puede utilizar para dar formato a una solicitud JSON. Voy a echar otro vistazo. – user1048348

+0

@ user1048348 Eso es exactamente lo que se ve en los ejemplos en las páginas Wiki. Sin embargo, su respuesta podría haber sido más útil si hubiera incluido una pequeña muestra de código para el OP, en lugar de solo un enlace. – Lankymart

1

La solicitud que está enviando es ..... no JSON. Intente usar esto como un validador: JSONLint. Tira la cadena JSON hacia allí y te dirá si es válida o no. En el caso anterior: [email protected]&firstname=joe&lastname=smith. Definitivamente no lo es.

Puede escribir JSON a mano, por ejemplo, me gustaría volver a escribir la consulta de la siguiente manera:

{"Email":"[email protected]", "firstname":"joe", "lastname":"smith"}

Espero que ayude. Sí, hay bibliotecas que pueden ayudarte a hacer esto (ASPJSON es una de ellas) pero para ser honesto, prefiero escribirlas yo mismo (ASP es muy difícil de manejar) o escribir mis propias funciones porque sé que puedo confiar en ellas. Aquí hay un fragmento de código de ejemplo que escribí en ASP que puede hacer una cadena JSON desde un objeto Dictionary. También puede tener matrices dentro de los elementos del diccionario. Desafortunadamente no es recursivo, por lo que no puede hacer arreglos de matrices o diccionarios de diccionarios ... pero funciona bien silencioso para entradas simples. Llamado json_encode después de la función de 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 
+0

En su ejemplo anterior, ha escrito el JSON entre corchetes. Esto no es válido, debe ser llaves, p. Ej. {"Correo electrónico": "[email protected]", "firstname": "joe", "lastname": "smith"} –

+0

@JackAllan duh gracias :) – MikeMurko

3

Porque me encontré con esto cuando se trata con eficacia para resolver el mismo problema - en mi caso, la publicación de ASP clásico a la API 2.0 MailChimp - quería hacerse eco de la amabilidad del enlace http://code.google.com/p/aspjson/, sino también tenga en cuenta algo que era al menos relevante en el caso de MailChimp. Pensé que podría simplemente formatear una cadena de aspecto JSON y enviar eso, pero no funcionó. Tuve que crear un objeto JSON usando los métodos en la biblioteca aspjson y luego usar el método jsString en la instrucción send. Por lo que el fragmento de código (después de las declaraciones correspondientes, incluye, etc.) sería algo como esto:

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 

la esperanza de que ayude a alguien más en el camino.

2
'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"":,""Test1Id"": 123456,""Test123"": 37,""Type123"": ""Test_String"",""contact"": {""name"": ""FirstName LastName"",""Organization"": ""XYZ"",""phone"":""123456"",""emailAddress"": ""[email protected]""}}" 

'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/") 
+1

Mejore el formato escribiendo sangría con 4 espacios. – ByteHamster

+0

Esto realmente debería ser la respuesta aceptada. –

Cuestiones relacionadas