Разобрать тело из GET-запроса с помощью nodejs, express, body-parser?

Можно ли получить содержимое body с помощью express?

Я начал с попытки body-parser, но, похоже, это не работает с GET. Есть ли модули, которые будут работать?

var express = require('express'),
  bodyParser = require('body-parser'),
  PORT = process.env.PORT || 4101,
  app = express();

app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

app.route('/')
  .get(function(req, res) {
    respond(req, res, 'GET body contents:\n');
  })
  .post(function(req, res) {
    respond(req, res, 'POST body contents:\n');
  });

app.listen(PORT, function(err) {
  if (err) {
    console.log('err on startup ' + err);
    return;
  }
  console.log('Server listening on port ' + PORT);
});

/*
 * Send a response back to client
 */
function respond(req, res, msg){
  res.setHeader('Content-Type', 'text/plain');
  res.write(msg);
  res.end(JSON.stringify(req.body, null, 2));
}

Это ответ от GET:

GET body contents:
{}

И от POST:

POST body contents:
{
    "gggg": ""
}

person bobbyrne01    schedule 05.04.2016    source источник
comment
Primo, запрос GET не имеет тела   -  person Héctor    schedule 05.04.2016
comment
взгляните на это: http://stackoverflow.com/questions/978061/http-get-with-request-body   -  person lauriys    schedule 05.04.2016
comment
GET-запрос не имеет тела. Вместо этого используйте POST.   -  person Sapikelio    schedule 05.04.2016
comment
GET-запросы @bigdestroyer позволяют получить тело   -  person bobbyrne01    schedule 05.04.2016
comment
@ bobbyrne01 Хотя у GET может быть тело, согласно спецификации HTTP, серверы должны его игнорировать, так как оно не имеет значения. См. этот ответ. Что сервер собирается делать со всеми этими UUID? Вполне вероятно, что нужно структурировать приложение по-другому, сверхдлинный URL-адрес вряд ли будет подходящим инструментом для этой работы...   -  person Mark Hughes    schedule 05.04.2016


Ответы (1)


У запросов GET нет тела, у них есть строки запроса. Чтобы получить доступ к строке запроса в ExpressJS, вы должны использовать объект req.query.

res.end(JSON.stringify(req.query, null, 2));
person Vsevolod Goloviznin    schedule 05.04.2016
comment
Проблема в том, что я хочу, чтобы пользователь отправил список uuids в тело запроса GET. Я буду искать эти uuids в базе данных. Могут быть переданы сотни uuids, должны ли они все быть помещены в строку query? - person bobbyrne01; 05.04.2016
comment
@ bobbyrne01 Почему тогда вы не можете использовать POST-запрос? Есть ограничение на длину строки запроса, но она достаточно велика. - person Vsevolod Goloviznin; 05.04.2016
comment
Я могу использовать POST, но старался оставаться как можно более RESTful. Я понимаю, что ограничение по длине велико, но есть вероятность, что я смогу его достичь. - person bobbyrne01; 05.04.2016
comment
Все зависит от архитектуры и требований. Например, вы можете ограничить количество элементов, которые могут быть обработаны в пакете, или вы можете сделать весь процесс асинхронным, когда вы публикуете пакет, а затем проверяете статус пакета. - person Vsevolod Goloviznin; 05.04.2016
comment
@ bobbyrne01 Если вы хотите сохранить RESTful, используйте заголовки GET. Они достигают того же эффекта, что и тело POST (и т. д.). Взгляните на owasp.org/index.php/. - person aggregate1166877; 25.02.2018