Есть ли более простой способ реализовать службу JSON REST с помощью net/http?
Я пытаюсь разработать REST- сервис с net/http
,
Служба получает структуру JSON, содержащую все входные параметры. Интересно, есть ли более простой и короткий способ реализовать следующее:
func call(w http.ResponseWriter, r *http.Request) {
if err := r.ParseForm(); err != nil {
fmt.Printf("Error parsing request %s\n", err)
}
var buf []byte
buf = make([]byte, 256)
var n, err = r.Body.Read(buf)
var decoded map[string]interface{}
err = json.Unmarshal(buf[:n], &decoded)
if err != nil {
fmt.Printf("Error decoding json: %s\n", err)
}
var uid = decoded["uid"]
...
}
Как видите, для извлечения первого параметра требуется довольно много строк. Есть идеи?
1 ответ
Решение
Вам не нужно звонить r.ParseForm
если тело запроса будет содержать структуру JSON и вам не нужны никакие параметры URL.
Вам также не нужен буфер; ты можешь использовать:
decoder := json.NewDecoder(r.Body)
А потом:
error := decoder.Decode(decoded)
Собираем все вместе:
func call(w http.ResponseWriter, r *http.Request) {
values := make(map[string]interface{})
if error := json.NewDecoder(r.Body).Decode(&values); error != nil {
panic(error)
}
uid := values["uid"].(int)
}
Однако было бы гораздо приятнее, если бы вы могли формально определить структуру ввода, которую вы ожидаете в типе структуры:
type UpdateUserInformationRequest struct {
UserId int `json:"uid"`
// other fields...
}
И используйте экземпляр этой структуры вместо более общей карты.