我正在尝试通过 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
alphadogg 的解决方案对我不起作用,我在
bStream.Write requestBody
行中遇到错误(表示“在此上下文中不允许操作。”)这似乎对我有用,并返回整个请求字符串。但是,它仅适用于请求数据<= 100 KB, otherwise you'll have to work out how to get the BinaryRead method working.
str = Request.Form
(发现于http://msdn.microsoft.com/en-us/library/ms525985%28v=VS.90%29.aspx)
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 报道。
这是我在 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)
您可以考虑从 VBScript 切换到 JScript(JScript 是微软所说的 JavaScript)。
为什么?因为在经典 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 对象发布到 ASP 服务器。
这个想法是这样的:未经测试。努力吧><.
将json对象解析成字符串然后回传到服务器。(这是典型的字符串发布)
在 ASP 端,使用 JSON 库将字符串解析回对象。
JSON 库的链接 http://code.google.com/p/aspjson/
'我假设尝试将 JSON 发布回 asp 的人应该具备基本的发布知识。任何进一步的帮助请告诉我
不知道您是否还在寻找,但这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
通常 (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的评论@Link
请注意,它可能无法正确处理编码。我没有深入研究 ADO 数据类型的 201 意味着什么,但它确实有效。
您可以通过此代码找到所有发布的参数。
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()