Go net/http
handler接收POST請求的JSON並轉為struct範例。
範例環境:
- Go 1.18
範例一 - json.Decoder
Employee
為JSON要轉成的struct。若http.Request.Method
為POST
時使用json.Decoder.Decode()
把http.Request.Body
轉為struct。
main.go
package main
import (
"encoding/json"
"fmt"
"net/http"
)
type Employee struct {
ID int64
Name string
Age int
}
func main() {
http.HandleFunc("/employee", func(w http.ResponseWriter, r *http.Request) {
switch r.Method {
case http.MethodPost:
var emp Employee
decoder := json.NewDecoder(r.Body)
err := decoder.Decode(&emp) // decode JSON to Employee
if err != nil {
panic(err)
}
fmt.Println(emp)
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(emp)
default:
http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
}
})
http.ListenAndServe(":8080", nil)
}
範例二 - json.Unmarshal
使用ioutil.ReadAll()
讀取http.Request.Body
為byte[]
然後傳入json.Unmarshal()
轉為struct。
main.go
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
)
type Employee struct {
ID int64
Name string
Age int
}
func main() {
http.HandleFunc("/employee", func(w http.ResponseWriter, r *http.Request) {
switch r.Method {
case http.MethodPost:
var emp Employee
b, err := ioutil.ReadAll(r.Body)
if err != nil {
panic(err)
}
json.Unmarshal(b, &emp)
fmt.Println(emp)
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(emp)
default:
http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
}
})
http.ListenAndServe(":8080", nil)
}
測試
啟動應用程式後在命令列以cURL發出以下請求。
$ curl -X POST "http://localhost:8080/employee" -H 'content-type: application/json' -d '{"id": 1, "name": "john", "age": 33}'
在console印出以下。
{1 john 33}
curl執行後返回的回應內容如下。
{"ID":1,"Name":"john","Age":33}
沒有留言:
張貼留言