Изменить тело запроса GET

Я создаю API для отдыха, используя restify, и мне нужно разрешить отправку тела в запросах на получение. Я использую bodyparser, но он дает только строку. Я хочу, чтобы это был объект, как в обычных конечных точках сообщений.

Как я могу превратить его в объект? Вот мой код:

const server = restify.createServer();
server.use(restify.queryParser());
server.use(restify.bodyParser());
server.get('/endpoint', function (req, res, next) {
    console.log(typeof req.body);
    console.log(req.body && req.body.asd);
    res.send(200);
});

person coder    schedule 15.06.2017    source источник
comment
Мне нужно разрешить тело сообщения в запросах на получение — это довольно странная необходимость. Спецификация HTTP предостерегает от запросов GET с полезной нагрузкой. Проектирование вашей системы вокруг них — странный выбор.   -  person Quentin    schedule 15.06.2017
comment
Вам необходимо предоставить минимально воспроизводимый пример. Похоже, вы предоставили весь необходимый код на стороне сервера, но не ввод, который вы ожидаете от него. Как выглядит запрос? В частности, что такое заголовок Content-Type и что такое тело запроса? (И вы подтвердили, что генерируете их правильно?)   -  person Quentin    schedule 15.06.2017


Ответы (1)


По умолчанию bodyParser в restify не анализирует действительный JSON (который, как я предполагаю, вы используете) для тела запросов, использующих метод GET. Вы должны предоставить объект конфигурации для инициализации bodyParser с ключом requestBodyOnGet, для которого установлено значение true:

server.use(restify.bodyParser({
    requestBodyOnGet: true
}));

Чтобы убедиться, что тело запроса будет в формате JSON, я также рекомендую вам проверить content-type в обработчике вашей конечной точки; например:

const server = restify.createServer();
server.use(restify.queryParser());
server.use(restify.bodyParser({
    requestBodyOnGet: true
}));
server.get('/endpoint', function (req, res, next) {
    // Ensures that the body of the request is of content-type JSON.
    if (!req.is('json')) {
        return next(new restify.errors.UnsupportedMediaTypeError('content-type: application/json required'));
    }
    console.log(typeof req.body);
    console.log(req.body && req.body.asd);
    res.send(200);
});
person mmso    schedule 15.06.2017