POST с Go не работает, но работает с curl
Я протестировал следующую команду curl для моего приложения, и она успешно возвращается:
curl --data "username=john&password=acwr6414" http://127.0.0.1:5000/api/login
Однако попытка повторить вышеописанное на ходу оказалась довольно сложной задачей, я продолжаю получать ошибку 400 Bad Request с сервера, вот код:
type Creds struct {
Username string `json:"username"`
Password string `json:"password"`
}
user := "john"
pass := "acwr6414"
creds := Creds{Username: user, Password: pass}
res, err := goreq.Request{
Method: "POST",
Uri: "http://127.0.0.1:5000/api/login",
Body: creds,
ShowDebug: true,
}.Do()
fmt.Println(res.Body.ToString())
fmt.Println(res, err)
Я использую пакет Goreq, я пробовал по крайней мере 3 или 4 других пакетов без разницы. Я получаю ошибку:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>400 Bad Request</title>
<h1>Bad Request</h1>
<p>The browser (or proxy) sent a request that this server could not understand.</p>
1 ответ
Решение
Вы отправляете тело json с вашим кодом Go, но application/x-www-form-urlencoded
тело с завитком
Вы можете закодировать строку вручную, как вы сделали с curl:
Body: "password=acwr6414&user=john",
Или вы можете использовать url.Values
чтобы правильно кодировать тело:
creds := url.Values{}
creds.Set("user", "john")
creds.Set("password", "acwr6414")
res, err := goreq.Request{
ContentType: "application/x-www-form-urlencoded",
Method: "POST",
Uri: "http://127.0.0.1:5000/api/login",
Body: creds.Encode(),
ShowDebug: true,
}.Do()