2014-01-28 1 views
3

Я пытаюсь отправить JSON через перенаправление 302. Это возможно в ExpressJS. API утверждает, что тело может быть добавлено res.json(). Например:Использование Express.js и NodeJS, можете ли вы отправить JSON через перенаправление в тело ответа

res.json(302, {'name': 'larry'}). 

На приемном конце (где также происходит перенаправление) корпус пуст. Вот некоторые примеры кода:

Отправка App

app.get('/hello', function(req,res){ 
    var data = {'name': 'larry'}; 
    res.set('location', 'http://www.example.com/sending'); 
    res.json(302, data); 
}); 

Прием App

app.get('/sending', function(req,res){ 
    console.log('Body: ' + req.body) 
    res.send(req.body); 
}); 

Примечание: заголовки ответа на 302 показать правильный контент-длину данных, но принимающая сторона показывает пустой объект.

+1

Перенаправление предназначено для перенаправления, вы не должны отправлять данные с него (кроме текстовых представлений о перенаправлении, обычно опускаемых агентами пользователя). – Darkhogg

ответ

6

Ваш код не имеет смысла. На первом маршруте вы скажете Экспресс ответить с переадресацией 302 и отправить некоторые данные. Отправляет ваш JSON клиенту, что вы можете видеть в том, что получаете правильный Content-Length.

Однако ваш второй маршрут не может работать. Во-первых, GET запросы не может иметь корпус; req.body будет всегда быть пустым.

Во-вторых, похоже, что вы предполагаете, что клиент, получающий перенаправление, повторно отправит тело сущности ответа на перенаправление в свой запрос к цели (example.com/sending в этом случае). Это неверно.

  • Клиент HTTP соответствующих спецификаций никогда не будет посылать ответа сервера как тело другого запроса.
  • HTTP-клиенты традиционно рассматривают 302 как 303, что означает, что запрос к целевому URL-адресу всегда является запросом GET, даже если исходный запрос был POST. Таким образом, перенаправленный запрос не может содержать какой-либо тип тела.

Если вы хотите отправить своего рода данных на другой сервер, у вас есть два варианта:

  • отправить данные по строке запроса с 303 редирект.

    // I'll use the built-in querystring module to convert an object into 
    // a properly URL-encoded query string. 
    res.redirect(303, '/url?' + querystring.stringify(data)); 
    
  • Ответить 200 и использовать браузер на стороне обман, чтобы POST данные в реальном назначения.

    res.send('<form id="redir" method="post" action="/url">' + 
         '<input type="hidden" name="foo" value="bar">' + 
         // ... 
         '</form>' + 
         '<script>document.getElementById("redir").submit()</script>'); 
    

    Уродливый, но работает если это предназначено для браузеров. Он не будет работать с запросами серверов или других нерабочих инструментов. Вы также можете включить кнопку отправки «Продолжить» для luddites, которые настаивают на просмотре с отключенным JS.

    Я бы использовал этот метод только в том случае, если количество данных, которое у вас есть, приведет к тому, что строка запроса будет превышать количество символов, допустимых в URL-адресе (~ 2048) или если полезная нагрузка данных содержит чувствительный контент, который, как правило, не должен быть включен в строку запроса.

+0

Не перенаправляет ли 307 метод POST и его исходные данные? –

+1

Да, * запрос * данные. HTTP-клиенты никогда не будут получать ответы POST * * *, полученные в ответ на перенаправление. – josh3736

+0

Ах, простите, я даже не читал конвой должным образом. –

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