2017-04-05 141 views
0

我一直在嘗試兩天來設置符合第三方提供程序要求的端點。他們將通過HTTPS POST向我們發送關於業務對象狀態的最新信息,請求內容將爲JSON。不幸的是,它現在必須用VBScript編寫。使用傳統ASP VBScript時無法獲取原始POST數據

目前,我無法獲得他們發送給我的請求的原始內容,所以我無法處理它。

我已經創建了一個簡單的終端(raw-form.asp)和兩個測試頁來演示這個問題。首先,我使用HTML表單設置了一個簡單的測試HTML頁面(raw-form-test1.asp),並且它可以正常工作。第二個測試頁面(raw-form-test2.asp)使用WinHttpRequest將內容發送到端點。當使用這個時,數據不在那裏。我試圖通過Request.Body獲取它。

原始形式-ASP:

<% 
    Dim post : post = Request.Body 
    Response.ContentType = "text/plain" 
    Response.Write "Your " & Request.ServerVariables("REQUEST_METHOD") & " data was: " & post 
%> 

原始外形test1.asp:

<!DOCTYPE html> 
<html> 
    <body> 
     <form action="raw-form.asp" method="post"> 
      <p><textarea name="data"></textarea></p> 
      <p><input type="submit"></p> 
     </form> 
    </body> 
</html> 

原始外形test2.asp:

<% 
    Dim data : data = Request.Form("data") 
    Dim resp : resp = "" 

    If data <> "" Then 
     Dim http : Set http = CreateObject("WinHttp.WinHttpRequest.5.1") 
     http.Open "post", "http://localhost:8080/raw-form.asp" 
     http.Send data 
     http.WaitForResponse(10) 
     resp = http.Status & " | " & http.ResponseText 
    End If 
%> 
<!DOCTYPE html> 
<html> 
    <body> 
     <%= Server.HTMLEncode(resp) %> 
     <form action="raw-form-test2.asp" method="post"> 
      <p><textarea name="data"></textarea></p> 
      <p><input type="submit"></p> 
     </form> 
    </body> 
</html> 

在填充在一些隨機文本和提交第一個測試,響應正文如我所料:

Your POST data was: data=abc

在使用第二次測試,在resp返回的結果是:

200 | Your POST data was:

我還試圖用Request.BinaryRead()沒有成功(VBScript中獲得獲得它的長度,而不是內容 - 可能只是VB類型的可怕)。我希望有另一種方式來獲取數據。

+0

根據第三方端點的設置方式,我不希望POST請求返回的結果不是'HTTP 200 OK'或更好的結果'HTTP 201 Created'。確定要返回的內容的唯一方法是在測試代碼時運行Fiddler。大多數*(不是全部)*基於HTTP的端點使用RESTful設計原則,閱讀這些原則可能會幫助您理解爲什麼除了'HTTP 200 OK'之外什麼都看不到。它可能在你沒有看到的響應中有一個「位置」標題,因爲你正在嘗試檢查正文。 – Lankymart

+0

這可能是有趣的*(假設它是RESTful)* - [瞭解REST:動詞,錯誤代碼和身份驗證](// stackoverflow.com/a/2022938) – Lankymart

+0

我剛剛意識到您的示例並不是說到第三方端點時,忽略我所說的問題可能是您在'raw-form-test2.asp'中調用了'Request.Form(「data」)'但是它假設來自哪裏?當然,你只是想要一些測試數據一串或什麼?如果通過表單提交調用該頁面,則只會在Request.Form中獲取某些內容。 – Lankymart

回答

3

在原始form.asp,您可以Response.BinaryWrite Request.BinaryRead的結果,就像這樣:

<% 
If Request.TotalBytes > 0 Then  
    Response.ContentType = "text/plain" 
    Response.Write "Your " & Request.ServerVariables("REQUEST_METHOD") & " data was: " 
    Response.BinaryWrite Request.BinaryRead(Request.TotalBytes) 
End If 
%> 

或者你可以使用Request.BinaryRead,然後寫字節到ADO流對象,然後你可以從中讀取文本。下面是一個例子:https://stackoverflow.com/a/9777124/989516

<% 

If Request.TotalBytes > 0 Then 
    Dim lngBytesCount, post 
    lngBytesCount = Request.TotalBytes 
    post = BytesToStr(Request.BinaryRead(lngBytesCount)) 
    Response.ContentType = "text/plain" 
    Response.Write "Your " & Request.ServerVariables("REQUEST_METHOD") & " data was: " & post 
End If 

Function BytesToStr(bytes) 
    Dim Stream 
    Set Stream = Server.CreateObject("Adodb.Stream") 
     Stream.Type = 1 'adTypeBinary 
     Stream.Open 
     Stream.Write bytes 
     Stream.Position = 0 
     Stream.Type = 2 'adTypeText 
     Stream.Charset = "iso-8859-1" 
     BytesToStr = Stream.ReadText 
     Stream.Close 
    Set Stream = Nothing 
End Function 

%> 
+0

他們正在做一個標準的'HTTP POST'沒有理由他們不能使用'Request.Form'我有的問題是他們似乎說他們使用'Request.Body'但在經典ASP中沒有這樣的屬性'Request'對象。 – Lankymart

+0

天才!謝謝...這就像一個魅力。我曾嘗試讓'BinaryRead'工作,但不知道我必須開始使用Streams來讀取它。我依稀記得另一個使用類似技術處理多部分表單數據的VBScript庫。 – BoffinbraiN

+0

@Lankymart我認爲如果您沒有指定(正確或忽略)POST請求的實際類型,VBScript的Request.Form停止工作。因此,獲取原始請求數據是必要的。 – BoffinbraiN

0

不過trying to understand的大問題是什麼,假設您的端點返回JSON,你可以修改示例代碼我張貼以下步驟進行操作。

Sub http_post() 
    Dim data : data = Request.Body 
    Dim resp : resp = "" 

    If data <> "" Then 
    Dim http : Set http = Server.CreateObject("WinHttp.WinHttpRequest.5.1") 
    http.Open "post", "http://localhost:1337/test9.asp?action=2" 
    Call http.setRequestHeader("Content-Type", "application/x-www-form-urlencoded") 
    http.Send "data=" & data 
    http.WaitForResponse(10) 
    resp = http.Status & " | " & http.ResponseText 
    End If 
    'Interpret the response from the xhr as JSON. 
    Response.ContentType = "application/json" 
    Call Response.Write(http.ResponseText) 
End Sub 

Sub http_xhr() 
    Dim post : post = Request.Body 
    Response.ContentType = "application/json" 
%>{ 
    data: { 
    "SomeItem": "SomeData", 
    "SomeNumber": 1, 
    "PostedData": "<%= post %>" 
    } 
}<% 
End Sub 
%> 

我只是測試你的代碼,並改組了一點,所以我可以用一個文件來測試它,它做同樣的事情。

<% 
Dim data, method 

Call init() 

Sub init() 
    Dim action 
    method = UCase(Request.ServerVariables("REQUEST_METHOD") & "") 

    Select Case method 
    Case "GET" 
    Call http_get() 
    Case "POST" 
    action = Request.QueryString("action") & "" 
    If Len(action) > 0 And IsNumeric(action) Then action = CLng(action) Else action = 1 
    Select Case action 
    Case 1 
     Call http_post() 
    Case 2 
     Call http_xhr() 
    End Select 
    End Select 
End Sub 

Sub http_get() 
%> 
<!DOCTYPE html> 
<html> 
    <body> 
    <form action="?action=1" method="post"> 
     <p><textarea name="data"></textarea></p> 
     <p><input type="submit"></p> 
    </form> 
    </body> 
</html> 
<% 
End Sub 

Sub http_post() 
    Dim data : data = Request.Form("data") 
    Dim resp : resp = "" 

    If data <> "" Then 
    Dim http : Set http = Server.CreateObject("WinHttp.WinHttpRequest.5.1") 
    http.Open "post", "http://localhost:1337/test9.asp?action=2" 
    'We are mimicing a form post use x-ww-form-urlencoded. 
    Call http.setRequestHeader("Content-Type", "application/x-www-form-urlencoded") 
    'Need to make sure we pass this as "data=value" so we can use `Request.Form("data") in the xhr call. 
    http.Send "data=" & data 
    http.WaitForResponse(10) 
    resp = http.Status & " | " & http.ResponseText 
    End If 
    Call Response.Write(resp) 
End Sub 

Sub http_xhr() 
    Dim post : post = Request.Form("data") 
    Response.ContentType = "text/plain" 
    Response.Write "Your " & Request.ServerVariables("REQUEST_METHOD") & " data was: " & post 
End Sub 
%> 

在使其工作的主要區別是;

  1. 設置在XHR的Content-Type頭,所以我們可以稱之爲Request.Form(與Request.Body,對我新的實際工作)。
  2. 將數據傳遞給xhr作爲data=value編碼值。
+0

謝謝你試圖幫助,但凱文柯林斯已經解決了這個問題。再次澄清,*我是必須編寫端點的人。第三方發佈給它。我無法控制他們使用的內容類型。我寫的測試頁面就是模擬這個問題。事實證明,他們使用'application/json'這就是爲什麼'Request.Form'和'Request.Body'不起作用的原因。 – BoffinbraiN

+0

@BoffinbraiN這清除它,對不起,我以爲你發送到端點和你模擬在。毫無意義的答案,但無論如何將離開它,可能會幫助某人。 – Lankymart

相關問題