2015-09-22 12 views
13

Vom documentation heißt es, dassWas ist der beste Weg, um nach einem leeren Anfragekörper zu suchen?

Für Server die Anforderung Körper fordert immer ungleich Null aber EOF sofort zurück, wenn kein Körper vorhanden ist.

Für ContentLength, die Dokumentation wird

Für Client-Anfragen, ein Wert von 0 bedeutet, unbekannt wenn Körper nicht gleich Null ist.

So ist es besser für ContentLength

r *http.Request 
if r.ContentLength == 0 { 
    //empty body 
} 

zu überprüfen oder EOF überprüfen

type Input struct { 
    Name *string `json:"name"` 
} 

input := new(Input) 

if err := json.NewDecoder(r.Body).Decode(input); err.Error() == "EOF" { 
//empty body 
} 
+2

EOF ist klar, ' 'Content-Length' ein Header ist, dass der Client kann oder nicht gesetzt. – thwd

+0

Mist nicht mit dem String-Wert von Fehlern. Wenn Sie nach 'io.EOF' suchen, dann tun Sie' if err == io.EOF'. Ein Blick auf die String-Darstellung ist bestenfalls sehr fragil. –

Antwort

15

Sie müssen immer den Körper lesen zu wissen, was der Inhalt. Der Client könnte den Körper in chunked Codierung ohne Content-Length senden, oder es könnte sogar einen Fehler haben und senden Sie eine Content-Length und keine Körper. Der Kunde ist niemals verpflichtet zu senden, was er sagt, dass er senden wird.

Die Prüfung EOF kann funktionieren, wenn Sie nur nach dem leeren Körper suchen, aber ich würde auch noch nach anderen Fehlerfällen neben der EOF Zeichenfolge suchen.

err := json.NewDecoder(r.Body).Decode(input) 
switch { 
case err == io.EOF: 
    // empty body 
case err != nil: 
    // other error 
} 

Sie können auch den gesamten Körper lesen, bevor unmarshalling:

body, err := ioutil.ReadAll(r.Body) 

oder wenn Sie zu viele Daten besorgt sind

body, err := ioutil.ReadAll(io.LimitReader(r.Body, readLimit)) 
0

Normalerweise kann man bei dem Verfahren aussehen von die Bitte zu wissen, ob eine Leiche zu erwarten ist oder nicht.

Zum Beispiel sollten GET-Anfragen nie einen Rumpf haben, und PUT und POST-Anfragen sollten einen haben.

So Ihre if Behauptung auch so geschrieben werden:

if r.Method == "PUT" || r.Method == "POST" { 
    // do something that depends on the body content 
} else { 
    // don't even try to read the body and do something else 
} 
Verwandte Themen