Голанг отдых апи и локон - PullRequest
0 голосов
/ 09 ноября 2018

Я хотел бы протестировать мой api golang rest с помощью curl.

Команда, которую я использовал для этого:

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.

1 Ответ

0 голосов
/ 09 ноября 2018

Как указано в комментариях, вы принимаете полезную нагрузку JSON, а не форму POST. Вот небольшой фрагмент, который поможет вам в работе с JSON, хотя в Интернете их много.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...