我想使用 curl 测试我的 golang rest api。
我以前做的命令:
curl -X POST -H "Content-Type: application/json" -d '{"username":"username","password":"password"}' "http://localhost:8000/api/rooms/signin"
我写的简化版服务器
package main
import (
"fmt"
"log"
"net/http"
"github.com/gorilla/mux"
)
func main() {
fmt.Println("Listening on port 8000")
router := mux.NewRouter()
router.HandleFunc("/api/rooms/signin", Signin)
log.Fatal(http.ListenAndServe(":8000", router))
}
func Signin(w http.ResponseWriter, r *http.Request) {
if r.Method == "POST" {
fmt.Println("POST")
if err := r.ParseForm(); err != nil {
fmt.Println("parsing failed")
return
}
fmt.Println("parsing success")
fmt.Println(r.Form)
fmt.Println("path: ", r.URL.Path)
fmt.Println("scheme: ", r.URL.Scheme)
username := r.FormValue("username")
password := r.FormValue("password")
fmt.Println(username)
fmt.Println(password)
fmt.Println("username:", r.Form["username"])
fmt.Println("password:", r.Form["password"])
return
}
}
问题是我得到一个空表格——这是我得到的输出
Listening on port 8000
POST
parsing success
map[]
path: /api/rooms/signin
scheme:
username: []
password: []
我想这是不对的,但我想不出我做错了什么。预期的输出是将“密码”和“用户名”字符串作为 golang 服务器的输出。
最佳答案
正如评论中所指出的,您接受的是 JSON 负载而不是 POST 表单。这里有一个小片段可以帮助您处理 JSON,尽管 Internet 上有很多。
func Signin(w http.ResponseWriter, r *http.Request) {
body, err := ioutil.ReadAll(r.Body)
if err != nil {
// error handling
}
params := make(map[string]string)
err = json.Unmarshal(body, ¶ms)
if err != nil {
// error handling
}
fmt.Println("username:", params["username"])
fmt.Println("password:", params["password"])
}
我建议创建一个具体的结构而不是 map[string]string
例如
type SigninBody struct {
Username string `json:"username"`
Password string `json:"password"`
}
然后像这样将它传递给 json.Unmarshal
:
var signinBody SinginBody
err = json.Unmarshal(body, &signinBody)
这是一个快速 Playgroud
关于linux - Golang 休息 api 和 curl ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53228898/