从发布的JSON获取经典ASP变量

时间:2010-04-21 10:59:54

标签: jquery json asp-classic

我正在尝试通过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

8 个答案:

答案 0 :(得分:2)

alphadogg的解决方案对我不起作用,我遇到了行bStream.Write requestBody的错误(说“在此上下文中不允许操作。”)这似乎对我有用,并返回整个请求字符串。但是,它只适用于请求数据< = 100 KB,否则您将不得不弄清楚如何使BinaryRead方法正常工作。

str = Request.Form

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

答案 1 :(得分: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报道的那样。

答案 2 :(得分:2)

这是我在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)

答案 3 :(得分:1)

您可以考虑从VBScript切换到JScript(JScript就是微软称之为JavaScript的东西)。

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

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

@Paddy:经典ASP和JSON很有趣,实际上它是ROCKS! (如果从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> <%        

%>  

答案 4 :(得分:1)

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

这是一个想法:没有经过测试。努力工作&gt;&lt;。

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

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

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

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

答案 5 :(得分:1)

不知道你是否还在寻找,但这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

答案 6 :(得分:0)

通常(新的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数据类型,但它确实有效。

答案 7 :(得分:-1)

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

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()