2010-06-22 6 views
5

Gibt es eine integrierte Möglichkeit, um im Racket die POST/GET Parameter zu erhalten? extract-binding und Freunde tun, was ich will, aber es ist eine schlimme Kenntnis über mögliche Sicherheitsrisiken angebracht Zusammenhang zum Hochladen von Dateien, die daherPOST/GET Bindungen im Racket

kommt zu dem Schluss, empfehlen wir gegen ihren Gebrauch, aber sie sind für Kompatibilität mit altem Code zur Verfügung gestellt.

Das Beste, was ich herausfinden kann (und verzeihen Sie mir im Voraus)

(bytes->string/utf-8 (binding:form-value (bindings-assq (string->bytes/utf-8 "[field_name_here]") (request-bindings/raw req)))) 

aber das scheint unnötig kompliziert (und es scheint, wie es von einigen der gleichen Fehler dokumentiert im Bindings-Abschnitt leiden würde).

Gibt es einen mehr oder weniger standardmäßigen, nicht fehlerhaften Weg, um den Wert einer POST/GET-Variable zu erhalten, wenn ein Feldname und eine Anfrage angegeben werden? Oder noch besser, eine Möglichkeit, eine Sammlung der POST/GET-Werte als Liste/Hash/A-Liste zurückzubekommen? Gibt es eine Funktion, die dasselbe macht, aber nur für POST-Variablen, wenn GETs ignoriert werden?

Antwort

3

Extrakt-Bindung ist schlecht, weil es Groß-und Kleinschreibung nicht, ist sehr chaotisch für Eingaben, die mehrere Male zurückgegeben, hat keinen Weg mit Datei-Uploads zu tun, und nimmt automatisch alles ist UTF-8, was nicht t unbedingt wahr. Wenn Sie diese Probleme akzeptieren können, zögern Sie nicht, es zu benutzen.

Das von Ihnen geschriebene Snippet funktioniert, wenn die Daten UTF-8 sind und wenn nur ein Feld zurückgegeben wird. Sie können definieren, dass es sich um eine Funktion handelt, und vermeiden Sie es, sie oft zu schreiben.

Im Allgemeinen empfehle ich die Verwendung von Formlets zum Umgang mit Formularen und deren Werten.

jetzt Ihre Fragen ...

"Gibt es eine mehr oder weniger Standard, Nicht-Buggy Art und Weise den Wert einen POST/GET-Variable zu bekommen, einen Feldnamen und Anforderung gegeben?"

Was Sie haben, ist die Standard-Sache, obwohl Sie fälschlicherweise davon ausgehen, dass es nur einen Wert gibt. Wenn es mehrere gibt, sollten Sie die Bindungen nach dem Feldnamen filtern. Ähnlich brauchen Sie nicht brauchen, um den Wert in eine Zeichenfolge zu verwandeln, können Sie es als Bytes einfach in Ordnung lassen.

"Oder noch besser, eine Möglichkeit, eine Sammlung der POST/GET-Werte als Liste/Hash/A-Liste zurückzuerhalten?"

Das ist, was Anfrage-Bindungen/Raw tut. Es ist eine Liste der Bindung? Objekte. Es macht keinen Sinn, es aufgrund mehrerer Rückgabewerte in einen Hash umzuwandeln.

"Abgesehen von diesen, gibt es eine Funktion, die das gleiche tun würde, aber nur für POST-Variablen, ignorieren GETs?"

Der Webserver verbirgt den Unterschied zwischen POSTs und GETs von Ihnen. Sie können uri und rohe Postdaten untersuchen, um sie wiederherzustellen, aber Sie müssten sie selbst analysieren. Ich empfehle es nicht.

Jay

+0

Sieht so aus, als hätte ich ein leicht gebrochenes Modell, wie die POST/GET-Variablenrepräsentation funktioniert. Wie gehen Formlets aus Neugier mit diesem Parsing um? Ist es im Grunde der gleiche "binding: form-value" -Ruf, den ich oben habe?Der Hauptgrund, warum ich nicht sofort die Formlet-Route gegangen bin, ist, dass ich versuche, über jQuery.ajax mit dem Server zu kommunizieren (der POST- oder GET-Variablen sendet, aber nicht unbedingt zugehörige Formularelemente hat). – Inaimathi