使用Classic ASP VBScript时无法获取原始POST数据

时间:2017-04-05 16:45:29

标签: vbscript asp-classic http-post

我已经尝试了两天来设置满足第三方提供商要求的端点。他们将通过HTTPS POST向我们发送有关业务对象状态的更新,并且请求的内容将是JSON。不幸的是,它现在必须用VBScript编写。

目前,我无法获取他们发送给我的请求的原始内容,因此我根本无法处理它。

我创建了一个简单的端点(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对类型很糟糕)。我希望有另一种方法来获取数据。

2 个答案:

答案 0 :(得分:4)

在raw-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

%>

答案 1 :(得分: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. 将数据作为data=value编码值传递给xhr。