linux - Golang 休息 api 和 curl

标签 linux go curl

我想使用 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, &params)
    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/

相关文章:

ruby-on-rails - 从 Fitbit API curl 和解析 URL

php - PHP cURL访问失败至远程Docker Hub/注册表

linux - GCC:内联汇编中的 putchar(char)

Android shell chown u0_49

Golang错误处理: understanding panic

go - 使用 Go 从文本文件中读取数据

c - Linux ioctl命令在用户空间和内核空间之间变化

linux - 用另一个文件中的字符串替换一个文件中的字符串的有效方法

json - JSON嵌套结构golang

curl - SOLR索引一个远程文件