2015-01-21 2 views
0

Интересно, какой правильный способ отправки формы - когда серверный сервер ожидает JSON. Сервер реализован в node.js, используя экспресс-структуру. Для анализа тела запроса используется промежуточное программное обеспечение bodyparser.json().Правильный способ POSTing JSON Formdata

В настоящее время я перехватываю отправку с использованием JavaScript, а затем создаю объект formdata, который, в свою очередь, отправляется с использованием ajax.

Моя проблема с этой реализацией заключается в том, что ответ POST представляет собой целую страницу, к которой пользователь должен быть перенаправлен. Я думал о замене содержимого HTML на странице содержимым ответа, но это кажется мне грязным, а также оставляет URL-адрес браузеров нетронутым.

TL; DR: Как отправить форму, чтобы она была доступна через req.body.myObj в экспресс, и браузер перенаправлен на ответ?

Спасибо за ваши идеи.

+0

Почему бы просто не разместить данные 'application/x-www-form-urlencoded', что и ожидало большинство серверов, включая bodyparser узла? – adeneo

+0

Мне нравится, как представленная форма становится доступной в req.body.Конечно, без каких-либо хлопот, если она представлена ​​в JSON. Может быть, я просто перейду на req.param –

ответ

0

Невозможно предоставить форму для отправки форматированного запроса JSON. (Для неподдерживаемого способа см. W3C HTML JSON form submission).

Единственный способ сделать это - использовать Ajax. Затем вы можете либо изменить DOM на основе ответа (обычный Ajax), либо сделать запрос GET, установив location (и передавать данные в сеансе/через URL/etc (что скорее взломать)).

Лучший подход, как правило, заключается в том, чтобы зарезервировать конечные точки, которые ожидают запросы JSON для HTTP-API, и написать конечные точки, которые ожидают форматирование URL-адресов или многочастных данных, когда вы хотите обрабатывать регулярную отправку формы.

// Don't do this 
app.use(bodyParser.json()); // for parsing application/json 

// Do this most of the time 
app.use(bodyParser.urlencoded({ extended: true })); // for parsing application/x-www-form-urlencoded 

// Do this if you have file inputs 
app.use(multer()); // for parsing multipart/form-data 

Код от the express docs.

Смежные вопросы