2010-04-21 9 views
10

Próbuję opublikować JSON przez AJAX na klasycznej stronie ASP, która pobiera wartość, sprawdza bazę danych i zwraca JSON do oryginalnej strony.Pobierz klasyczną zmienną ASP z posta JSON

Mogę opublikować JSON przez AJAX. Mogę zwrócić JSON z ASP. Nie mogę pobrać wysłanego JSON do zmiennej ASP.

POST używasz Request.Form, POBIERZ używać Request.Querystring. Co używam w JSON?

Mam biblioteki JSON, ale pokazują one tylko tworzenie ciągu znaków w skrypcie ASP, a następnie przetwarzanie. Muszę parsować JSON od momentu przekazania zmiennej zewnętrznej.

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'); 
     } 
}); 

plik 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 
+0

nie mam odpowiedzi, ale trzeba każdą moją sympatię ... klasycznym ASP i obsługę JSON - brzmi zabawnie. – Paddy

+0

To bardzo ciekawe ... Jesteś pewien, że to nie jest POST czy GET, który wysyła JSON ?! Czy próbowałeś zweryfikować to na przykładzie Alexa? – cregox

+3

@Paddy: Klasyczna ASP nadal pomaga umieścić jedzenie na talerzach dla mojej rodziny. Podobnie jak COBOL, nie jest jeszcze martwy. ;-) – Taptronic

Odpowiedz

-1

można znaleźć wszystkie parametry wysłana za pośrednictwem tego kodu.

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

Problem polega na tym, że gdy JSON jest POSTED do klasycznej strony ASP, nie parsuje go do obiektu Form. Podobnie, jeśli masz go w GET bez wiązania go z parametrem. – alphadogg

1

Możesz rozważyć przełączenie z VBScript na JScript (JScript to to, co Microsoft nazywa JavaScript).

Dlaczego? Ponieważ z poziomu klasycznej ASP można wykonywać te same wywołania JSON, które przeglądarka może wykonywać, i odczytać wyniki w obiektach JavaScript za pomocą instrukcji eval().

Paddy Said: Nie mam odpowiedzi, ale masz moje wszystkie sympatie ... klasyczne podejście do asp i JSON - brzmi jak zabawa.

@Paddy: Klasyczne ASP i JSON JEST zabawne, w rzeczywistości to ROCKS! (Jeśli zmienisz VBScript i użyjesz JScript.)

Pamiętaj, że nie musisz opuszczać VBScript cold-turkey, nadal możesz współdziałać między tymi dwoma w tym samym pliku ASP, ale jeśli najpierw zadeklarujesz JScript aby ograniczyć twój VBScript do SUB lub funkcji i odwrotnie, w przeciwnym razie mogą się wydarzyć nieprzewidywalne rzeczy.

Oto krótki przykład tego, co mówię:

<%@ 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> <%   

%> 
+1

Czy nie byłoby naprawdę niebezpiecznie zrobić eval łańcucha json po stronie serwera? – Ben

+1

Tak, ale w jaki sposób uzyskujesz dostęp do danych POSTed? – alphadogg

1

I mający ten sam problem, ale bardzo szybko i dowiedzieć się, jak umieścić obiekt json do serwera ASP.

Oto pomysł: nie testowany. Ciężko na nim pracować> <.

Przetwarza obiekt json do łańcucha wtedy zakładać z powrotem do serwera. (Jest to typowy ciąg wpis)

na stronie ASP, należy użyć biblioteki JSON do analizowania ciąg z powrotem do obiektu.

link do biblioteki JSON http://code.google.com/p/aspjson/

„Zakładam ppl, które próbują pocztowy JSON z powrotem do asp powinien posiadać podstawową wiedzę księgowania. W przypadku dalszej pomocy proszę dać mi znać

0

Generalnie (nowa tablica VBArray (arr) .toArray()) powinna działać na SafeArray, co zwraca Request.BinaryRead. Ale tak nie jest.Znalazłem rozwiązanie, które ja poprawiony:

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; 
} 

dzięki za komentarz Rasberry @http://blogs.msdn.com/b/david.wang/archive/2006/07/04/howto-convert-between-jscript-array-and-vb-safe-array.aspx

pamiętać, że nie może obsłużyć kodujący prawidłowo. Nie zanotowałem, co oznacza 201 dla ADO, ale działa.

1

Nie wiem, czy nadal szukasz, ale ta answer może ci pomóc. Jednak kod jest przeznaczony dla stron ASP.NET. Klasyczny ASP analog to:

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

Następnie, prawdopodobnie chcesz przekształcić go w ciąg do analizy/użytkowania. Możesz użyć ADODB.Stream do konwersji. Rozwiązanie

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

alphadogg za nie działa dla mnie, mam błędy z linią bStream.Write requestBody (mówiąc „Operacja nie jest dozwolona w tym kontekście.”) To wydaje się działać dla mnie, i zwraca całą żądania ciąg. Jednak będzie działać tylko dla danych żądania < = 100 KB, w przeciwnym razie będziesz musiał dowiedzieć się, jak uzyskać działanie metody BinaryRead.

str = Request.Form 

(Odkryta od http://msdn.microsoft.com/en-us/library/ms525985%28v=VS.90%29.aspx) Kod

2

alphadogg pracował dla mnie, ale dopiero po tym, jak podano trochę więcej informacji:

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

Przed tym chciałbym uzyskać „Operacja nie jest dozwolona w tym kontekście." jak donosił Jjokin.

2

Oto rozwiązanie, które użyłem w ASP VBScript z kodem radu i pewne korekty:

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)