Получить классическую переменную ASP из опубликованной JSON
Я пытаюсь отправить JSON через AJAX на страницу классического ASP, которая извлекает значение, проверяет базу данных и возвращает JSON на исходную страницу.
Я могу отправить JSON через AJAX. Я могу вернуть JSON из ASP. Я не могу получить отправленный JSON в переменную ASP.
POST вы используете Request.Form, GET вы используете Request.Querystring. Что я использую для JSON?
У меня есть библиотеки JSON, но они показывают только создание строки в ASP script и затем разбор этого. Мне нужно разобрать 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
Ответы
Ответ 1
Решение alphadogg не работает для меня, я получил ошибки с линией bStream.Write requestBody
(говоря: "Операция в этом контексте не разрешена".) Это, похоже, работает для меня и возвращает всю строку запроса. Однако он будет работать только для данных запроса <= 100 КБ, в противном случае вам нужно будет выяснить, как получить метод BinaryRead.
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 - это то, что Microsoft вызывает JavaScript).
Почему? Потому что изнутри классического ASP вы можете выполнять те же вызовы JSON, которые браузер может делать, и читать результаты в объектах JavaScript, используя оператор eval().
Пэдди Саид:
У меня нет ответа, но у меня есть все мои симпатии... классическая обработка asp и JSON - звучит весело.
@Paddy: Классический ASP и JSON - это весело, на самом деле это ROCKS!
(Если вы переключаетесь с VBScript и используете JScript.)
Обратите внимание, что вам не нужно выходить из VBScript cold-turkey, вы все равно можете взаимодействовать между ними в одном и том же файле 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> <%
%>
Ответ 5
У меня такая же проблема, но очень скоро я выясню, как отправить json-объект на сервер ASP.
Вот идея: не проверена. Много работайте над этим > <.
Разберите объект json в строку, затем отправьте обратно на сервер (это типичная проводка строки)
на стороне ASP, используйте библиотеку JSON для анализа строки обратно в объект.
для библиотеки JSON
http://code.google.com/p/aspjson/
'Я предполагаю, что ppl, который пытается опубликовать JSON в asp, должен иметь базовые знания проводки. Любая дополнительная помощь, пожалуйста, дайте мне знать
Ответ 6
Не знаю, хотите ли вы по-прежнему смотреть, но этот ответ может вам помочь. Однако код предназначен для страниц 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
Обычно (новый 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 comment @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()