Тело запроса Beego POST всегда пусто

Я работаю с удобными методами Beego для анализа значений тела запроса и имею следующее:

Файл роутера:

    apiNamespace := beego.NewNamespace("/api")

    apiNamespace.Router("/sessions/google/new", &controllers.SessionsController{}, "get:GoogleNewSession")

    beego.AddNamespace(apiNamespace)

Код контроллера:

func (c *SessionsController) URLMapping() {
    c.Mapping("GoogleNewSession", c.GoogleNewSession)
}

func (c *SessionsController) GoogleNewSession() {

    // Always serve JSON
    defer func() {
        c.ServeJson()
    }()

    // This is always blank
    log.Printf("'Received %+v'", c.Ctx.Input.RequestBody)

    c.Ctx.ResponseWriter.WriteHeader(200)
    return

    // truncated
}

Фронтенд JS (суперагент):

    request
    .post('/sessions/google/new')
    .use(prefix)
    .send({ code: authCode })
    .set('Accept', 'application/json')
    .end(function(err, res){
        console.log("******* request", res.request)
         if (res.ok) {
            var body = res.body;
            console.log('yay got ' + JSON.stringify(res.body));
         } else {
            console.log("***** err", err);
            console.log("***** not ok", res.text);
         }
     });

Когда запрос суперагента срабатывает, я вижу в журналах, что путь сопоставляется правильно. Однако c.Ctx.Input.RequestBody всегда пуст.

Я пытался использовать что-то еще, чтобы запустить запрос, например Postman, но безрезультатно. В запросах GET я могу правильно получить параметры запроса.

Любые подсказки или предложения, которые помогут исправить или отладить эту проблему?


person nightscent    schedule 22.06.2015    source источник
comment
Вы можете сделать HTTP-захват, чтобы убедиться, что тело запроса не пусто?   -  person Jiang YD    schedule 23.06.2015
comment
Эй, как вы предлагаете мне это сделать? В сетевой консоли разработчика Chrome я проверил, что тело включает в себя полезную нагрузку, например {code: 123}, но при печати всего запроса на Beego он пуст :(   -  person nightscent    schedule 23.06.2015
comment
Итак, у вас есть печать Received []?   -  person Jiang YD    schedule 24.06.2015
comment
@JiangYD да, при попытке использовать тело JSON оно всегда кажется пустым. Однако я попытался изменить заголовок на .set('Content-Type', 'application/x-www-form-urlencoded'), и я могу получить поля в файле c.Ctx.Input.Request.Form.Get("code"). Любая идея, почему это так?   -  person nightscent    schedule 25.06.2015
comment
почему тогда вы не установили тип содержимого в json? я видел ваш код .set('Accept', 'application/json'), но не Content-Type.   -  person Jiang YD    schedule 26.06.2015
comment
Я пропустил это в исходном посте, но на самом деле я уже пробовал, но безуспешно. Я перешел с beego на gin, и точно такой же код суперагента работает отлично. Не знаю, что еще я сделал не так, но кажется, что слишком много усилий для отладки простой развертки json POST. Спасибо за попытку!   -  person nightscent    schedule 28.06.2015


Ответы (1)


Вам необходимо настроить «copyrequestbody = true» в файле конфигурации «conf/app.conf».

По умолчанию установлено значение false, поэтому содержимое не копируется в c.Ctx.Input.RequestBody.

В качестве примера показан раздел «Получение данных из тела запроса» в документе. (http://beego.me/docs/mvc/controller/params.md)

person Edcyc    schedule 06.08.2015
comment
это решение! - person lionelmessi; 09.01.2016
comment
вы не представляете, сколько я прогуглил, чтобы получить этот ответ! - person TDo; 03.02.2021