2015-10-10 5 views
0

Я использую node.js для отправки HTTP POST на сервер APP. Адрес электронной почты [email protected] в блоке POST отображается как joe% 40gmail.com на стороне сервера APP. Я использовал Content-Type text/plain в следующем коде, но application/x-www-form-urlencoded фактически находится в заголовке запроса POST в соответствии с журналом сервера.Недопустимый заголовок HTTP-сообщения

Мой предыдущий пост имеет ошибку в результатах postman для Chrome. Пожалуйста, проигнорируйте это и извините за путаницу.

Я новичок в этом и, возможно, пропустил что-то очевидное здесь. Любая помощь приветствуется.

Вот код:

var express = require("express"); 
var app = module.exports = express(); 
var request = require('request'); 
var config = require('../config'); 
app.post('/', function(req, res) { 

    var username = req.body.name; 
    var password = req.body.passwd; 
    var email = req.body.email; 
    console.log("email=", email); 

    // connect to APP server 
    var url = config.appServer; 

    request({ 
     uri: url, 
     method: "POST", 
     timeout: 10000, // 10 sec 
     headers: { 
      'Content-Type': 'text/plain' 
     }, 
     form: { 
      act: 'create', 
      username : username, 
      passwd: password, 
      email: email 
     } 
     }, function (error, response, body) { 
      // handle return here 
+0

Похоже, что он закодирован в url, вы попробовали просто 'decodeURIComponent()' it? – adeneo

+0

Похоже, что это проблема с вашим другим приложением, а не с этим, так как 'console.log' выводит правильную строку. Обновите вопрос с помощью кода обработчика сообщения '/ account' – gfpacheco

+0

Нет, я не пробовал decodeURIComponent(). Я могу использовать Chrome, safari для отправки HTTP GET-запроса с той же строкой. Они все правильно отображаются на стороне сервера APP. Я, вероятно, пропустил что-то в заголовке node.js-запроса, но не знаю, что. – gfc

ответ

0

Это совершенно нормальное поведение. Также вам не нужно устанавливать заголовок content-type при использовании опции form с request.

Вот краткий пример:

request({ 
    uri: 'http://requestb.in/1g2xzno1', 
    method: 'POST', 
    timeout: 10000, // 10 sec 
    form: { 
    act: 'create', 
    username : 'username', 
    passwd: 'password', 
    email: '[email protected]' 
    } 
    }, function (err, res, body) { 
    if (err) console.log(err) 
    console.log(body) 
    }) 

Вы можете увидеть результаты от этой просьбы here. Это то, что получает ваш сервер приложений. Тогда все, что вам нужно сделать, это разобрать тело запроса на ваш сервере приложений (это строка ниже заголовка RAW ТЕЛА):

var qs = require('qs') 
qs.parse('act=create&username=username&passwd=password&email=joe%40gmail.com') 

{ act: 'create', 
    username: 'username', 
    passwd: 'password', 
    email: '[email protected]' } 

Кроме того, если вы используете Express, на ваш сервере приложений вы можете использовать body-parser промежуточные программное обеспечение, что сделают то же самое для вас:

app.use(bodyParser.urlencoded({extended: true})) 
+0

Симо, спасибо за объяснение. Я также попытался заменить «форму» на «json» в приведенном выше коде, а затем я могу установить заголовок в application/json. Он работает сейчас. – gfc

+0

Примите ответ, если он сработает для вас. Таким образом, ответ будет разобран как ответ. – simo

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