查看: 423|回复: 0

[文章教程] ASP接收其他接口平台提交过来的表单数据

[复制链接]
xuanxiao 发表于 2022-8-12 18:09:12 | 显示全部楼层 |阅读模式
导读:
一般情况下,ASP都是用来Request.Form来获取post/get提交过来的数据,但实际上呢,如果是java或php提交过来的话,用Request.Form得到的可能就是空值。因此,最稳妥的办法是使用二进制流得到数据。

第一种方法:根据键名获取数据
  1. <%
  2. '1.得到Request表单数据字节数
  3. FormSize = Request.TotalBytes
  4. '2.使用二进制读取Request表单数据
  5. FormData = Request.BinaryRead(FormSize)
  6. '3.创建对象数组
  7. Set dataArray = Server.CreateObject("Scripting.Dictionary")  ' Server.CreateObject("Scripting.Dictionary")
  8. dataArray.Add "pay_id", GetFormVal(FormData,"pay_id")
  9. dataArray.Add "pay_money", GetFormVal(FormData,"pay_money")
  10. dataArray.Add "pay_price", GetFormVal(FormData,"pay_price")
  11. dataArray.Add "pay_no", GetFormVal(FormData,"pay_no")
  12. dataArray.Add "pay_time", GetFormVal(FormData,"pay_time")
  13. dataArray.Add "pay_type", GetFormVal(FormData,"pay_type")
  14. dataArray.Add "param", GetFormVal(FormData,"param")
  15. dataArray.Add "sign", GetFormVal(FormData,"sign")
  16. '4.输出测试
  17. response.write(dataArray("sign"))

  18. '/**获取表单数据里的值
  19. ' * @param FormData 二进制的表单数据
  20. ' * @param FormName  键名
  21. ' */
  22. Function GetFormVal(FormData,FormName)
  23.         'Chr返回一个Unicode字符,2个字节
  24.         'ChrB返回一个ANSI字符,1个字节
  25.         charBs = ChrB(13) & ChrB(10)
  26.         Divider = LeftB(FormData, InStrB(FormData, charBs) - 1)
  27.         GetFormVal = ""
  28.         StartPos = LenB(Divider) + 2
  29.         FormName = Chr(34) & FormName & Chr(34)
  30.         Do While StartPos > 0
  31.         strlen = InStrB(StartPos, FormData, charBs) - StartPos
  32.         SearchStr = MidB(FormData, StartPos, strlen)
  33.         If InStr(binTostr(SearchStr,"utf-8"), FormName) > 0 Then
  34.                 ValStart = InStrB(StartPos, FormData, charBs & charBs) + 4
  35.                 ValLen = InStrB(StartPos, FormData, Divider) - 2 - ValStart
  36.                 ValContent = MidB(FormData, ValStart, ValLen)
  37.                 If GetFormVal <> "" Then
  38.                         GetFormVal = GetFormVal & "," & binTostr(ValContent,"utf-8")
  39.                 Else
  40.                         '二进制转化
  41.                         GetFormVal = binTostr(ValContent,"utf-8")
  42.                 End If
  43.         End If
  44.         If InStrB(StartPos, FormData, Divider) < 1 Then
  45.         Exit Do
  46.         End If
  47.         StartPos = InStrB(StartPos, FormData, Divider) + LenB(Divider) + 2
  48.         Loop
  49. End Function

  50. '/**二进制转化(将二进制转换为字符串)
  51. ' * @param vin 要转换的二进制
  52. ' * @param charset 编码方式 utf-8或者gb2312
  53. ' */
  54. Function binTostr(vin,charset)
  55.     Const adTypeText = 2
  56.     Dim BytesStream,StringReturn
  57.     Set BytesStream = Server.CreateObject("ADODB.Stream")
  58.         With BytesStream
  59.                 .Type = adTypeText
  60.                 .Open
  61.                 .WriteText vin
  62.                 .Position = 0
  63.                 .Charset = charset
  64.                 .Position = 2
  65.                 StringReturn = .ReadText
  66.                 .Close
  67.         End With
  68.         Set BytesStream = Nothing
  69.         binTostr = StringReturn
  70. End Function
  71. %>
复制代码

第二种方法:直接返回完整的键值对数组
  1. <%
  2. '1.得到Request表单数据字节数
  3. FormSize = Request.TotalBytes
  4. '2.使用二进制读取Request表单数据
  5. FormData = Request.BinaryRead(FormSize)
  6. '3.获取键值对格式的数组
  7. Set dataArray=GetFormData(FormData)
  8. '4.输出测试
  9. response.write(dataArray("sign"))

  10. '/**获取表单数据
  11. ' * @param FormData 二进制的表单数据
  12. ' * @return 返回键值对格式的数组
  13. ' */
  14. Function GetFormData(FormData)
  15.         'Chr返回一个Unicode字符,2个字节
  16.         'ChrB返回一个ANSI字符,1个字节
  17.         charBs = ChrB(13) & ChrB(10)
  18.         Divider = LeftB(FormData, InStrB(FormData, charBs) - 1)
  19.         StartPos = LenB(Divider) + 2
  20.         '创建对象数组
  21.         Set dataArray = Server.CreateObject("Scripting.Dictionary")  ' Server.CreateObject("Scripting.Dictionary")
  22.         Do While StartPos > 0
  23.                 strlen = InStrB(StartPos, FormData, charBs) - StartPos
  24.                 SearchStr = MidB(FormData, StartPos, strlen)
  25.                 '1.获取单个表单元素属性,如:Content-Disposition: form-data; name="键名"
  26.                 FormItem=binTostr(SearchStr,"utf-8")
  27.                 '2.获取键名
  28.                 FormName=Right(FormItem,Len(FormItem)-Instr(FormItem,"="))
  29.                 '3.去掉键名的双引号
  30.                 FormName = Replace(FormName, """", "")
  31.                 FormValue=""
  32.                 If FormName <> "" Then
  33.                         ValStart = InStrB(StartPos, FormData, charBs & charBs) + 4
  34.                         ValLen = InStrB(StartPos, FormData, Divider) - 2 - ValStart
  35.                         ValContent = MidB(FormData, ValStart, ValLen)
  36.                         If FormValue <> "" Then
  37.                                 FormValue = FormValue & "," & binTostr(ValContent,"utf-8")                       
  38.                         Else
  39.                                 '二进制转化
  40.                                 FormValue = binTostr(ValContent,"utf-8")
  41.                         End If
  42.                         '添加元素到数组中
  43.                         dataArray.Add FormName, FormValue
  44.                 End If               
  45.                 If InStrB(StartPos, FormData, Divider) < 1 Then
  46.                         Exit Do
  47.                 End If
  48.                 StartPos = InStrB(StartPos, FormData, Divider) + LenB(Divider) + 2
  49.         Loop
  50.         Set GetFormData=dataArray
  51.         Set dataArray=nothing
  52. End Function

  53. '/**二进制转化(将二进制转换为字符串)
  54. ' * @param vin 要转换的二进制
  55. ' * @param charset 编码方式 utf-8或者gb2312
  56. ' */
  57. Function binTostr(vin,charset)
  58.     Const adTypeText = 2
  59.     Dim BytesStream,StringReturn
  60.     Set BytesStream = Server.CreateObject("ADODB.Stream")
  61.         With BytesStream
  62.                 .Type = adTypeText
  63.                 .Open
  64.                 .WriteText vin
  65.                 .Position = 0
  66.                 .Charset = charset
  67.                 .Position = 2
  68.                 StringReturn = .ReadText
  69.                 .Close
  70.         End With
  71.         Set BytesStream = Nothing
  72.         binTostr = StringReturn
  73. End Function
  74. %>
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表

在线客服

售前咨询
售后咨询
服务热线
023-58418553
微信公众号