2011-11-15 77 views
5

我完全失去了。我正嘗試從使用vbscript的經典asp頁面發佈到遠程服務器上的API。我的代碼:使用xmlhttp的傳統ASP頁面可以發出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 

我收到請求未處於預期格式的響應。技術支持人員告訴我,API期望在帖子正文中使用JSON。我可以從服務器端的ASP做到這一點嗎?

回答

1

檢查了這一點,它應該幫助你做你想要什麼:

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

祝你好運!

+0

Bugget,我之前下載過,但是我看不出如何用它來格式化JSON請求。我會再看一次。 – user1048348

+0

@ user1048348這正是它在維基頁面上看到的例子。但是,如果您爲OP提供了一小段代碼樣本,而不僅僅是一個鏈接,那麼您的答案可能會更有幫助。 – Lankymart

1

您要發送的請求是.....而不是JSON。嘗試將此用作驗證程序:JSONLint。把你的JSON字符串放在那裏,它會告訴你它是否有效。在上面的情況下:[email protected]&firstname=joe&lastname=smith。這絕對不是。

您可以手工編寫JSON,舉例如下我會重寫查詢:

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

我希望幫助。是的,有些庫可以幫助你做到這一點(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 
+0

在上面的示例中,您已將JSON寫入方括號中。這是無效的,它應該是花括號,例如{「Email」:「[email protected]」,「firstname」:「joe」,「lastname」:「smith」} –

+0

@JackAllan duh謝謝:) – MikeMurko

3

因爲我碰到這個跑時有效試圖解決同樣的問題 - 在我的情況,張貼從ASP經典的MailChimp 2.0 API - 我想呼應http://code.google.com/p/aspjson/鏈接的樂於助人,而且還請注意MailChimp中至少有相關的內容。我以爲我可以簡單地格式化一個JSON字符串併發送它,但它不起作用。我必須使用aspjson庫中的方法創建JSON對象,然後在send語句中使用jsString方法。因此,代碼段(在適當的聲明,包括等)將是這個樣子:

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 

希望一路走來幫助別人。

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

請用4位空格縮進代碼來改進格式。 – ByteHamster

+0

這真的應該是被接受的答案。 –