2015-09-22 6 views
13

documentation से यह कहा गया है किखाली अनुरोध निकाय के लिए जांच करने का सबसे अच्छा तरीका क्या है?

सर्वर के लिए अनुरोध करता है अनुरोध शरीर हमेशा गैर नहीं के बराबर है लेकिन EOF तुरंत वापस आ जाएगी जब कोई शरीर मौजूद है।

ContentLength के लिए, प्रलेखन राज्यों

ग्राहक अनुरोधों के लिए, 0 मान अज्ञात अर्थ है कि यदि शरीर नहीं के बराबर नहीं है।

तो यह बेहतर ContentLength

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

के लिए जाँच करने के लिए या EOF

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, 'सामग्री-Length' एक हैडर है कि ग्राहक या सेट नहीं कर सकते कर सकते हैं। – thwd

+0

त्रुटियों के स्ट्रिंग मान के साथ मक न करें। यदि आप 'io.EOF' की तलाश में हैं तो 'if if == io.EOF' करें। स्ट्रिंग प्रतिनिधित्व को देखकर सबसे अविश्वसनीय रूप से नाजुक है। –

उत्तर

15

तुम हमेशा पता है कि सामग्री रहे हैं शरीर पढ़ने की जरूरत है की जांच करने के लिए है। ग्राहक शरीर को बिना किसी Content-Length के साथ खंडित एन्कोडिंग में भेज सकता है, या इसमें कोई त्रुटि भी हो सकती है और Content-Length और कोई भी शरीर नहीं भेज सकता है। क्लाइंट को यह भेजने के लिए बाध्य नहीं किया जाता है कि वह क्या कहता है कि वह भेजने जा रहा है।

EOF चेक कर सकते हैं यदि आप केवल खाली निकाय की जांच कर रहे हैं, लेकिन मैं अभी भी EOF स्ट्रिंग के अलावा अन्य त्रुटि मामलों की जांच भी करूंगा।

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

तुम भी unmarshalling से पहले पूरे शरीर पढ़ सकते हैं:

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

या यदि आप

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

आमतौर पर बहुत अधिक डेटा बारे में चिंतित हैं, तो आप की विधि देख सकते हैं शरीर की अपेक्षा करने के लिए गीलेर को जानने का अनुरोध या नहीं।

उदाहरण के लिए, जीईटी अनुरोधों में कभी शरीर नहीं होना चाहिए, और PUT और POST अनुरोधों में से एक होना चाहिए।

तो अपने if दावा भी उसी रूप में लिखा जा सकता है:

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 
} 
संबंधित मुद्दे