Как получить значения POST из этого запроса? - PullRequest
0 голосов
/ 30 октября 2018

У меня есть следующий код :

package main

import (
    "bytes"
    "fmt"
    "net/http"
)

func main() {

    var jsonStr = []byte(`{"title":"Buy cheese and bread for breakfast."}`)
    req, err := http.NewRequest("POST", "/", bytes.NewBuffer(jsonStr))
    if err != nil {
        panic(err)
    }
    req.Header.Set("X-Custom-Header", "myvalue")
    req.Header.Set("Content-Type", "application/json")

    req.ParseForm()
    fmt.Printf("%v:%v", "title", req.Form.Get("title"))
}

Я не могу извлечь параметр "title" и не знаю почему.

Ответы [ 3 ]

0 голосов
/ 30 октября 2018

Как отмечено в GoDoc для метода http.Request.ParseForm, тип тела должен быть application/x-www-form-urlencoded, а не JSON, как в вашем текущем примере:

Для других методов HTTP, или когда Content-Type не является application / x-www-form-urlencoded, Тело запроса не читается, и r.PostForm инициализируется не равным nil пустое значение

Вот обновленный пример вашего кода с использованием тела формы, который дает ожидаемый результат: https://play.golang.org/p/Zrw05T2Zb5Z

Если вы хотите извлечь значения из тела JSON, это можно сделать с помощью такого метода, как json.Unmarshal, однако тело JSON не представляет форму.

0 голосов
/ 30 октября 2018

Третий аргумент http.NewRequest - это полезная нагрузка http.

В вашем случае тип полезной нагрузки application/json. Это нужно рассматривать как json, только тогда вы сможете получить определенную ценность от него. В этом случае мы просто не можем использовать тот же метод, что и при получении значения из строки запроса или данных формы.

Так что просто распакуйте данные jsonStr в карту или структуру.

res := make(map[string]interface{})
err := json.Unmarshal(jsonStr, &res)
if err != nil {
    panic(err)
}
fmt.Printf("%#v \n", res["title"])

Если честно, я совершенно запутался в вашем вопросе, почему вам нужно получить полезную нагрузку из http-запроса клиента.

Если на самом деле вы хотите получить полезную нагрузку от конца веб-сервера, вы можете получить ее, расшифровав тело запроса. Пример:

http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    payload := make(map[string]interface{})
    err := json.NewDecoder(r.Body).Decode(&payload)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    title := payload["title"].(string)
    w.Write([]byte(title))
})

Пример скручивания (на основе вашего кода):

curl -d '{"title":"Buy cheese and bread for breakfast."}' \
     -H "Content-Type: application/json" \
     -X POST http://localhost:9000

Выход:

Buy cheese and bread for breakfast.
0 голосов
/ 30 октября 2018

Потому что ваш запрос не является формой. Он не имеет параметров GET и не является закодированными данными.

Для других методов HTTP, или когда Content-Type не является application / x-www-form-urlencoded, тело запроса не читается, и r.PostForm инициализируется как ненулевое пустое значение.

[https://golang.org/pkg/net/http/#Request.ParseForm]

Вы можете анализировать тело запроса как application/json, но это не то же самое, что форма данных.

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