【问题标题】:Get Classic ASP variable from posted JSON从发布的 JSON 中获取经典 ASP 变量
【发布时间】:2011-02-10 13:20:36
【问题描述】:

我正在尝试通过 AJAX 将 JSON 发布到经典 ASP 页面,该页面检索值、检查数据库并将 JSON 返回到原始页面。

我可以通过 AJAX 发布 JSON。我可以从 ASP 返回 JSON。我无法将发布的 JSON 检索到 ASP 变量中。

POST 使用 Request.Form,GET 使用 Request.Querystring。 JSON 有什么用?

我有 JSON 库,但它们只显示在 ASP 脚本中创建一个字符串然后对其进行解析。我需要在传递外部变量时解析 JSON。

Javascript

var thing = $(this).val();

$.ajax({
         type: "POST",
         url: '/ajax/check_username.asp',
         data: "{'userName':'" + thing + "'}",
         contentType: "application/json; charset=utf-8",
         dataType: "json",
         cache: false,
         async: false,
         success: function() {
            alert('success');
         }
});

ASP 文件 (check_username.asp)

    Response.ContentType = "application/json"
          sEmail = request.form() -- THE PROBLEM

          Set oRS = Server.CreateObject("ADODB.Recordset")
          SQL = "SELECT SYSUserID FROM dbo.t_SYS_User WHERE Username='"&sEmail&"'" 
          oRS.Open SQL, oConn
          if not oRS.EOF then 
            sStatus = (new JSON).toJSON("username", true, false)
          else
            sStatus = (new JSON).toJSON("username", false, false)
        end if
response.write sStatus

【问题讨论】:

  • 我没有答案,但我很同情你...经典的 asp 和 JSON 处理 - 听起来很有趣。
  • 这很好奇...您确定 JSON 发出的不是 POST 或 GET 吗?!你试过用 Alex 的例子来验证吗?
  • @Paddy:经典的 ASP 仍然有助于为我的家人提供食物。就像 COBOL 一样,它还没有死。 ;-)

标签: jquery json asp-classic


【解决方案1】:

alphadogg 的解决方案对我不起作用,bStream.Write requestBody 行出现错误(说“在这种情况下不允许操作。”)这似乎对我有用,并返回整个请求字符串。但是,它仅适用于

str = Request.Form

(发现自http://msdn.microsoft.com/en-us/library/ms525985%28v=VS.90%29.aspx

【讨论】:

    【解决方案2】:

    alphadogg 的代码对我有用,但只有在我指定了更多信息之后:

    bytecount = Request.TotalBytes
    bytes = Request.BinaryRead(bytecount)
    
    Set stream = Server.CreateObject("ADODB.Stream");
    stream.Type = 1;    // adTypeBinary              
    stream.Open();                                   
    stream.Write(bytes);
    stream.Position = 0;                             
    stream.Type = 2;    // adTypeText                
    stream.Charset = "utf-8";                        
    Set s = stream.ReadText();                       
    stream.Close();                                  
    

    在此之前,我会收到“在此上下文中不允许操作”。正如 jjokin 报道的那样。

    【讨论】:

      【解决方案3】:

      这是我在 ASP Vbscript 中使用 Radium 的代码和一些更正的解决方案:

      bytecount = Request.TotalBytes
      bytes = Request.BinaryRead(bytecount)
      
      Set stream = Server.CreateObject("ADODB.Stream")
          stream.Type = 1 'adTypeBinary              
          stream.Open()                                   
              stream.Write(bytes)
              stream.Position = 0                             
              stream.Type = 2 'adTypeText                
              stream.Charset = "utf-8"                      
              s = stream.ReadText() 'here is your json as a string                
          stream.Close()
      Set stream = nothing
      
      Response.write(s)
      

      【讨论】:

        【解决方案4】:

        您可以考虑从 VBScript 切换到 JScript(JScript 就是微软所说的 JavaScript)。

        为什么?因为在 Classic ASP 中,您可以执行与浏览器相同的 JSON 调用,并使用 eval() 语句将结果读入 JavaScript 对象。

        帕迪说: 我没有答案,但你有我的同情......经典的 asp 和 JSON 处理 - 听起来很有趣。

        @Paddy:经典的 ASP 和 JSON 很有趣,事实上它非常棒! (如果您从 VBScript 切换并使用 JScript。)

        请注意,您不必退出 VBScript 冷火鸡,您仍然可以在同一个 ASP 文件中的两者之间进行互操作,但如果您首先声明 JScript,您需要将您的 VBScript 限制为 SUB 或函数,反之亦然可能会发生不可预知的事情。

        下面是我所说的一个简单示例:

        <%@ LANGUAGE="JScript" %>
        <%
        
        var days = VBDateDiff("d", "4/10/2010", "5/3/2010");
        Response.write("JScript Calling VBScript function: days = " + days);
        
        
        %> <script language="VBScript" runat="server">
        function VBDateDiff(units, datebefore, dateafter)
            VBDateDiff = CStr(DateDiff(units, datebefore, dateafter))
        end function
        
        function VBDateAdd(units, nUnits, theDate)
            Response.write("<BR>VBDateAdd units=" & units & ", nUnits=" & nUnits & ", theDate=" & theDate)
            VBDateAdd = CStr(DateAdd(units, nUnits, theDate))
            Response.write(", VBDateAdd=" & VBDateAdd)
        end function
        </script> <%        
        
        %>  
        

        【讨论】:

        • 对 json 字符串进行服务器端评估真的很危险吗?
        • 是的,但是您如何访问已发布的数据?
        【解决方案5】:

        我有同样的问题,但很快我就知道如何将 json 对象发布到 ASP 服务器。

        这是一个想法:未经测试。努力吧><.>

        将 json 对象解析为字符串,然后回传到服务器。(这是一个典型的字符串发布)

        在 ASP 端,使用 JSON 库将字符串解析回对象。

        JSON 库的链接 http://code.google.com/p/aspjson/

        '我认为尝试将 JSON 发布回 asp 的用户应该具备基本的发布知识。如果有任何进一步的帮助,请告诉我

        【讨论】:

          【解决方案6】:

          不知道您是否还在寻找,但这个answer 可能会对您有所帮助。但是,该代码适用于 ASP.NET 页面。经典的 ASP 类比是:

            byteCount = Request.TotalBytes
            requestBody = Request.BinaryRead(byteCount)
          

          然后,你可能想把它变成一个字符串来解析/使用。您可以使用 ADODB.Stream 进行转换。

            Set bStream= CreateObject("ADODB.Stream")
            bStream.Open
            bStream.Write requestBody
            bStream.Position = 0
            bStream.Type = adTypeText 
            str = bStream.ReadText
          

          【讨论】:

            【解决方案7】:

            通常 (new VBArray(arr).toArray()) 应该在 SafeArray 上工作,这就是 Request.BinaryRead 返回的内容。但事实并非如此。我找到了我修改过的这个解决方案:

            function GetRawRequestData() {
                var byteCount = Request.TotalBytes;
                var binary = Request.BinaryRead(byteCount)
                var reader = Server.CreateObject('ADODB.Recordset');
                reader.Fields.Append('x', 201, byteCount);
                reader.Open();
                reader.AddNew();
                reader.Fields(0).AppendChunk(binary);
                reader.update();
                return reader.Fields(0).Value;
            }
            

            感谢 Rasberry 的评论@http://blogs.msdn.com/b/david.wang/archive/2006/07/04/howto-convert-between-jscript-array-and-vb-safe-array.aspx

            请注意,它可能无法正确处理编码。我没有深入研究 201 对 ADO 数据类型的含义,但它确实有效。

            【讨论】:

              【解决方案8】:

              您可以通过此代码找到所有发布的参数。

              FUNCTION getQueryString()
                  dim queryLink, queryItemName
                  queryLink = ""
                  On error Resume Next
                  For each queryItemName in Request.QueryString
                      Execute(queryItemName & " = stripQuery(Request.QueryString(""" & queryItemName & """))")
                      queryLink = queryLink & "&" & queryItemName & "=" & Request.QueryString(queryItemName)
                  Next
                  For each queryItemName in Request.Form
                      Execute(queryItemName & " = stripQuery(Request.Form(""" & queryItemName & """))")
                      queryLink = queryLink & "&" & queryItemName & "=" & Request.Form(queryItemName)
                  Next
                  On Error Goto 0
                  getQueryString = queryLink
              END FUNCTION
              
              response.write getQueryString()
              

              【讨论】:

              • 问题是当 JSON 被 POST 到一个经典的 ASP 页面时,它不会将它解析成 Form 对象。同样,如果您将它放在 GET 中而不将其绑定到参数。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2014-01-10
              • 1970-01-01
              • 2016-10-14
              • 1970-01-01
              • 2012-06-05
              • 2010-11-03
              • 1970-01-01
              相关资源
              最近更新 更多