Golang请求体一直报EOF错误。

huangapple go评论115阅读模式
英文:

Golang request body keep giving EOF error

问题

我有以下的Go程序,我想要读取通过POST发送的JSON值。我尝试了几种不同的方法,例如首先使用r.Body = http.MaxBytesReader(w, r.Body, 1048576),然后再运行Json.NewDecoder(r.Body).Decode(&u)。所有的方法似乎都会出现相同的EOF错误。我甚至尝试了body, err := ioutil.ReadAll(r.Body)。所以所有的方法看起来都是一样的。

  1. func insertUser(w http.ResponseWriter, r *http.Request) {
  2. type User struct {
  3. Uemail string `json:"uEmail"`
  4. Upass string `json:"uPass"`
  5. }
  6. var u User
  7. if r.Method == "POST" {
  8. if r.Header.Get("Content-Type") != "" {
  9. value, _ := header.ParseValueAndParams(r.Header, "Content-Type")
  10. if value != "application/json" {
  11. msg := "Content-Type header is not application/json"
  12. json.NewEncoder(w).Encode(Errormessage{msg});
  13. return
  14. }
  15. }
  16. //r.Body = http.MaxBytesReader(w, r.Body, 1048576)
  17. /*body, err := ioutil.ReadAll(r.Body)
  18. if err != nil {
  19. return err
  20. }*/
  21. err := json.NewDecoder(r.Body).Decode(&u)
  22. if err != nil {
  23. fmt.Println("Decoding error is :", err)
  24. json.NewEncoder(w).Encode(Errormessage{"Message decoding Issue"});
  25. return
  26. }
  27. var uEmail string = u.Uemail
  28. var uPass string = u.Upass
  29. fmt.Println("User Namess :", uEmail)
  30. fmt.Println("User Password :", uPass)
  31. w.Header().Set("Content-Type", "application/json; charset=utf-8")
  32. w.Header().Set("X-Content-Type-Options", "nosniff")
  33. }
  34. }
英文:

I have the following Go program which I want to read the JSON values send from via post. I have tried few different methods example r.Body = http.MaxBytesReader(w, r.Body, 1048576) first then only run Json.NewDecoder(r.Body).Decode(&u). All methods seems to be giving the same EOF error. I have even tried this body, err := ioutil.ReadAll(r.Body). So all seem the same

  1. func insertUser(w http.ResponseWriter, r *http.Request) {
  2. type User struct {
  3. Uemail string `json:"uEmail"`
  4. Upass string `json:"uPass"`
  5. }
  6. var u User
  7. if r.Method == "POST" {
  8. if r.Header.Get("Content-Type") != "" {
  9. value, _ := header.ParseValueAndParams(r.Header, "Content-Type")
  10. if value != "application/json" {
  11. msg := "Content-Type header is not application/json"
  12. json.NewEncoder(w).Encode(Errormessage{msg});
  13. return
  14. }
  15. }
  16. //r.Body = http.MaxBytesReader(w, r.Body, 1048576)
  17. /*body, err := ioutil.ReadAll(r.Body)
  18. if err != nil {
  19. return err
  20. }*/
  21. err := json.NewDecoder(r.Body).Decode(&u)
  22. if err != nil {
  23. fmt.Println("Decoding error is :", err)
  24. json.NewEncoder(w).Encode(Errormessage{"Message decoding Issue"});
  25. return
  26. }
  27. var uEmail string = u.Uemail
  28. var uPass string = u.Upass
  29. fmt.Println("User Namess :", uEmail)
  30. fmt.Println("User Password :", uPass)
  31. w.Header().Set("Content-Type", "application/json; charset=utf-8")
  32. w.Header().Set("X-Content-Type-Options", "nosniff")
  33. }

答案1

得分: 1

请尝试运行以下代码:

  1. func insertUser(w http.ResponseWriter, r *http.Request) {
  2. type User struct {
  3. Uemail string `json:"uEmail"`
  4. Upass string `json:"uPass"`
  5. }
  6. var u User
  7. if r.Method == "POST" {
  8. if r.Header.Get("Content-Type") != "" {
  9. value, _ := header.ParseValueAndParams(r.Header, "Content-Type")
  10. if value != "application/json" {
  11. msg := "Content-Type header is not application/json"
  12. json.NewEncoder(w).Encode(Errormessage{msg})
  13. return
  14. }
  15. }
  16. // CODE CHANGED HERE
  17. body, err := ioutil.ReadAll(r.Body)
  18. defer r.Body.Close()
  19. if err != nil {
  20. // handle error
  21. return
  22. }
  23. err = json.Unmarshal(body, &u)
  24. if err != nil {
  25. // handle error
  26. return
  27. }
  28. // CHANGED TILL HERE
  29. var uEmail string = u.Uemail
  30. var uPass string = u.Upass
  31. fmt.Println("User Namess :", uEmail)
  32. fmt.Println("User Password :", uPass)
  33. w.Header().Set("Content-Type", "application/json; charset=utf-8")
  34. w.Header().Set("X-Content-Type-Options", "nosniff")
  35. }
  36. }

这段代码是一个用于插入用户的函数。它首先定义了一个名为User的结构体,包含了UemailUpass两个字段。然后,它检查请求的方法是否为POST,并且检查请求头中的Content-Type是否为application/json。如果不是,它会返回一个错误消息。

接下来,代码读取请求体中的数据,并将其解析为User结构体。然后,它将UemailUpass赋值给相应的变量,并打印出来。

最后,代码设置响应头的Content-Type为application/json,并返回响应。

英文:

Please try running the following

  1. func insertUser(w http.ResponseWriter, r *http.Request) {
  2. type User struct {
  3. Uemail string `json:"uEmail"`
  4. Upass string `json:"uPass"`
  5. }
  6. var u User
  7. if r.Method == "POST" {
  8. if r.Header.Get("Content-Type") != "" {
  9. value, _ := header.ParseValueAndParams(r.Header, "Content-Type")
  10. if value != "application/json" {
  11. msg := "Content-Type header is not application/json"
  12. json.NewEncoder(w).Encode(Errormessage{msg});
  13. return
  14. }
  15. }
  16. // CODE CHANGED HERE
  17. body, err := ioutil.ReadAll(r.Body)
  18. defer r.Body.Close()
  19. if err != nil {
  20. // handle error
  21. return
  22. }
  23. err = json.Unmarshal(body, &u)
  24. if err != nil {
  25. // handle error
  26. return
  27. }
  28. // CHANGED TILL HERE
  29. var uEmail string = u.Uemail
  30. var uPass string = u.Upass
  31. fmt.Println("User Namess :", uEmail)
  32. fmt.Println("User Password :", uPass)
  33. w.Header().Set("Content-Type", "application/json; charset=utf-8")
  34. w.Header().Set("X-Content-Type-Options", "nosniff")
  35. }
  36. }

huangapple
  • 本文由 发表于 2022年4月13日 20:41:04
  • 转载请务必保留本文链接:https://go.coder-hub.com/71857665.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定