Запрос узла завершается с ошибкой, когда тело содержит специальные символы

#javascript #json #node.js #http

#javascript #json #node.js #http

Вопрос:

Я использую node.js и библиотека под названием requestify. Код выглядит следующим образом:

 console.log('body');
console.log(body);
return new Promise(function (f, r) {
        requestify.request(myurl, {
            method: 'POST',
            body : body,
            headers : {
                "Content-Type" : "application/json; charset=utf-8"
            }
        })
            .then(function (response) {
                f({messge : "Success"});
            }, function (err) {
                console.log(err);
                err.code == 405 ? r(err.body) : r({ success: false, message: err });
            });
    });
  

Когда запрос содержит специальные символы (в данном случае шведские символы), он выдает ошибку.

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

На самом деле у меня нет доступа к серверу, который обрабатывает запрос, поэтому его сложно отлаживать. Но я печатаю тело перед отправкой запроса и не вижу в нем никаких странных вещей. Вот 2 разных запроса тела:

// СБОЙ

 { eventType: 'createUser',
eventId: '1e2ca3b4-0f6b-4ed9-ae79-2e112c8d693c',
version: '0.1',
date: 2016-10-07T06:42:26.209Z,
attributes: 
 { userName: 'akeandersson@gmail.se',
 email: 'akeandersson@gmail.se',
 firstName: 'Åke',
 lastName: 'Andresson',
 phoneNumber: '1',
 identifier: '198509120328',
 assignment: 'se.me',
 role: [ 'se.me.role.user' ] },
 metadata: {} }
  

// УСПЕХ

 { eventType: 'createUser',
eventId: '1e2ca3b4-0f6b-4ed9-ae79-2e112c8d693c',
version: '0.1',
date: 2016-10-07T06:44:09.857Z,
attributes: 
{ userName: 'akeandersson212@gmail.se',
email: 'akeandersson212@gmail.se',
firstName: 'Ake',
lastName: 'Andresson',
phoneNumber: '9',
identifier: '196606095823',
assignment: 'se.me',
role: [ 'se.me.role.user' ] },
metadata: {} }
  

Я также помещаю «; charset= utf-8» в тип содержимого заголовка (по умолчанию это уже utf-8 согласно документации requestify).
Но результат все тот же. Есть идеи, как я мог бы это отладить?

Это то, что сервер возвращает при сбое запроса:

 {
code: 400,
headers: 
{ connection: 'close',
'content-type': 'text/plain',
'content-length': '244',
date: 'Fri, 07 Oct 2016 06:42:27 GMT' },
body: 'Unexpected end-of-input: expected close marker for OBJECT (from  [Source: ServletInputStreamImpl@75eb88e4; line: 1, column: 0])n at [Source: ServletInputStreamImpl@75eb88e4; line: 1, column: 767]' }
  

Комментарии:

1. Какая версия requestify у вас есть?

2. «запрос»: «^ 0.1.17»

3. Ни один из этих ответов не является допустимым JSON, поэтому я удивлен, что ни один из них не сработал.

4. Вы можете попробовать загрузить данные, используя другую кодировку (что, вероятно, было бы проще сделать, используя что-то вроде cURL), чтобы узнать, есть ли у сервера проблемы, в частности, с UTF-8.

Ответ №1:

Я думаю, вам нужно загрузить свой requestify модуль в самую последнюю версию. Я использую version 0.2.3 , который не выдает мне никаких ошибок.

Предполагая, что вы столкнулись с ошибкой при попытке прочитать символ norwegian (или) swedish , я попытался прочитать веб-сайт, на котором есть norwegian символы, и с помощью приведенного ниже кода я могу вывести его на консоль без каких-либо ошибок. То же самое и со swedish страницей. Я использую 0.2.3 версию (которая является самой последней версией). Я тоже не установил кодировку UTF-8 .

 var requestify = require('requestify'); 

requestify.get('http://www.norwegian4people.com/lesson.php?id=41').then(function(response) {
    // Get the response body 
    console.log(response.getBody());
});
  

Надеюсь, это поможет!