Есть ли более простой способ реализовать службу 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...
}

И используйте экземпляр этой структуры вместо более общей карты.

Другие вопросы по тегам