Gewusst wie: abrufen von Daten in das Formular (als array)
Ich bin ein PHP-Dev. Aber derzeit bewegen zu Golang... ich versuche Sie zum abrufen von Daten aus einem Formular (Post-Methode):
<!-- A really SIMPLE form -->
<form class="" action="/Contact" method="post">
<input type="text" name="Contact[Name]" value="Something">
<input type="text" name="Contact[Email]" value="Else">
<textarea name="Contact[Message]">For this message</textarea>
<button type="submit">Submit</button>
</form>
In PHP würde ich einfach die Verwendung dieser Daten zu erhalten:
<?php
print_r($_POST["Contact"])
?>
//Output would be something like this:
Array
(
[Name] => Something
[Email] => Else
[Message] => For this message
)
ABER in go... entweder ich bekomme eins oder die ganze Sache aber nicht den Kontakt [] - Array nur wie PHP
Ich dachte an 2 Lösungen:
1) Holen Sie sich eins nach dem anderen:
//r := *http.Request
err := r.ParseForm()
if err != nil {
w.Write([]byte(err.Error()))
return
}
contact := make(map[string]string)
contact["Name"] = r.PostFormValue("Contact[Name]")
contact["Email"] = r.PostFormValue("Contact[Email]")
contact["Message"] = r.PostFormValue("Contact[Message]")
fmt.Println(contact)
//Output
map[Name:Something Email:Else Message:For this Message]
Beachten Sie, dass die Karte die Schlüssel sind der ganzen: "Wenden Sie sich an[Name]"...
2) Auswahl ganze Karte r.Form
und "analysieren|zu erhalten", die diese Werte mit Präfix
"Wenden Sie sich an[" und dann wieder "Kontakt[" und "]" mit einem leeren string
also ich kann das Form-array-Key ist, nur wie das PHP-Beispiel
Ging ich für diese Arbeit durch meine eigene, aber... angefangen über die ganze form nicht unbedingt eine gute Idee (?)
//ContactPost process the form sent by the user
func ContactPost(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
err := r.ParseForm()
if err != nil {
w.Write([]byte(err.Error()))
return
}
contact := make(map[string]string)
for i := range r.Form {
if strings.HasPrefix(i, "Contact[") {
rp := strings.NewReplacer("Contact[", "", "]", "")
contact[rp.Replace(i)] = r.Form.Get(i)
}
}
w.Write([]byte(fmt.Sprint(contact)))
}
//Output
map[Name:Something Email:Else Message:For this Message]
Beide Lösungen geben Sie mir die gleiche Ausgabe... Aber im 2. Beispiel brauche ich nicht unbedingt zu wissen, die Tasten "Kontakt[]"
Ich weiß... ich kann einfach nur vergessen, dass die "Form " Array" und nutzen name="Email"
auf meine Eingaben und abrufen, aber... ich habe die durch einige Szenarien, in denen ich mit EINER form, die mehr als 2 arrays von Daten und verschiedene Dinge tun mit jedem, wie ORMs
Frage 1: gibt es einen einfacheren Weg, um meine Form Array als eine tatsächliche Karte in Golang, wie PHP funktioniert?
Frage 2: Sollte ich wieder an die Daten, die man durch eine (Mühsame so viel und ich kann ändern die Form-Daten an und irgendwann neu kompilieren,...) oder die Iteration der ganzen Sache, wie ich es getan habe in dem 2. Beispiel.
Sorry für mein schlechtes Deutsch... vielen Dank im Voraus!
- stackoverflow.com/questions/23713817/...
- Nee, das hilft nicht... Beachten Sie meine Formular-Daten-array unabhängige Tasten, auch wenn es keine Tasten, keine Möglichkeit, richtig zu identifizieren, die einem entsprechen, die man...
- Sie können ganz einfach schreiben Sie Ihre eigene form-parser durchläuft alle Schlüssel in der form, und die Gruppen "Name[Schlüssel]" Felder in einem sub-Wörterbuch.
- Da ich nicht finden konnte, so etwas, das ist ziemlich viel, was ich Tat, meine eigene func... Gut werde ich machen, eine Struktur für das speichern der analysierten form und verwenden Sie es wie ich brauchen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie die
PostForm
Mitglied derhttp.Request
geben. Es ist der Typurl.Werte
-- was ist eigentlich (ta-da) einemap[string][]string
, und Sie behandeln kann, ist als solche. Sie müssen noch zu nennenreq.ParseForm()
Erster, though.Beachten Sie, dass
PostForm
ist eine Karte von Listen von strings. Das ist, weil in der Theorie, jedes Feld anwesend sein konnte, mehrere Male in der POST-body. DiePostFormValue()
- Methode verarbeitet diese implizit durch die Rücksendung der ersten von mehreren Werten (also, wenn Ihr POST-body ist&foo=bar&foo=baz
, dannreq.PostFormValue("foo")
immer wieder"bar"
).Beachten Sie auch, dass
PostForm
werden, enthalten nie geschachtelte Strukturen so, wie Sie es von PHP. Go ist statisch typisiert, ein POST-Formular, wird der Wert immer werden, die eine Zuordnung vonstring
(name)[]string
(Werte/s).Persönlich, ich würde nicht mit dem Klammer-syntax (
contact[email]
) für PFOSTEN-Feld-Namen in Anwendungen Gehen; das ist eine PHP-spezifische Konstrukt sowieso und wie Sie bereits bemerkt haben, Gehen Sie nicht unterstützt, sehr gut.Wahrscheinlich gibt es keine richtige Antwort. Wenn Sie die Zuordnung Ihrer POST-Felder in einem struct mit statischen Feldern, haben Sie explizit ordnen Sie Sie an einem gewissen Punkt (oder verwenden Sie
reflektieren
zu implementieren einige Magische auto-mapping).Ich hatte die gleiche Frage. Die Einreichung von array-form params ist auch Redewendungen in der Ruby/Rails-Welt, wo ich denn herkomme. Aber, nach einigen Recherchen, es sieht aus wie das ist nicht wirklich der "Geh-Weg".
Habe ich mit der dot-prefix-Konvention:
contact.name
,contact.email
usw.Läuft dieser server und dann curling es:
Ergebnisse in:
Mit dem Gorilla-Toolkit
Können Sie auch die Gorilla-Toolkit-Schema-Paket, um eine Analyse der form-Parameter in eine struct, in etwa so:
Läuft dieser server und dann curling es:
Ergebnisse in:
Ich hatte ein ähnliches problem, also schrieb ich diese Funktion
Es stellt eine Sammlung der form Schlüssel-Wert-Paare in einer Liste von string-Karten. Zum Beispiel, wenn ich Formular-Daten wie diese:
Kann ich rufe meine Funktion übergeben die typeName-von "Kontakte":
Und es gibt eine Liste von zwei map-Objekte, jede Karte mit keys für "Name" und "Ort". In der JSON-notation, würde es so Aussehen:
Welches übrigens, genau wie ich im posting, die Daten bis zum server in einer ajax-Anfrage:
Wenn die Formular-Daten-key-Struktur nicht ganz zu meinen passen, dann habe ich Sie könnte wahrscheinlich passen die Regex, die ich verwende, um Ihre Bedürfnisse anzupassen.