Неправильная кодировка в запросах jsonp ajax - PullRequest
3 голосов
/ 18 апреля 2011

Я делаю ajax-запрос следующим образом:

function apiCall(resource, data, callback) {
   if(data == undefined || data == null) data = {};
   $.ajax({
       dataType: 'jsonp',
       data: data,
       url: nodeUri + "/" + resource
   }).success(callback).error(function(jqXHR, textStatus, errorThrown) { alert(errorThrown); });
}

Хотя это работает для большинства вызовов, некоторые запросы jsonp не отображаются, показывая ошибку «неопределенный строковый литерал» в консоли firebug со следующей строкой:

jQuery151005229747375124583_1303069060...size chart women)\r\n\r\nx-small \r\n


Когда я копирую тело запроса и заменяю имя функции обратного вызова jquery на console.log, происходит сбой с той же ошибкой, но если я копирую его в Notepad ++ в режиме ANSI перед отправкой обратно на консоль, он работает нормально. Кодировка в заголовке ответа - utf-8.

В чем может быть причина того, что jquery не может выполнить синтаксический анализ этих запросов?

Редактировать: Я использую node.js с Express в качестве сервера.

Это полное тело ответа, которое я получаю из запроса ajax:

jQuery151019804588618633323_1303079165535({"price":{"currency_code":"EUR","cents":12000},"image_colors":[{"blue":99,"hex":"636363","green":99,"red":99},{"blue":255,"hex":"ffffff","green":255,"red":255}],"default_image":{"big":"http://s32.dawandastatic.com/Product/9709/9709590/big/1271709158-113.jpg?20101021091023","mini":"http://s32.dawandastatic.com/Product/9709/9709590/mini/1271709158-113.jpg?20101021091023","listview":"http://s32.dawandastatic.com/Product/9709/9709590/listview/1271709158-113.jpg?20101215201220","thumb":"http://s32.dawandastatic.com/Product/9709/9709590/thumb/1271709158-113.jpg?20101021091023","listing":"http://s32.dawandastatic.com/Product/9709/9709590/listing/1271709158-113.jpg?20101021091023","full":"http://s32.dawandastatic.com/Product/9709/9709590/full/1271709158-113.jpg?20101021091023","long":"http://s32.dawandastatic.com/Product/9709/9709590/long/1271709158-113.jpg?20101021091023","pin":"http://s32.dawandastatic.com/Product/9709/9709590/pin/1271709158-113.jpg?20101215201220"},"user":{"name":"goodmorningmidnight","id":1791458,"restful_path":"/users/1791458"},"ranking":0.6636759628828178,"likes":0,"dislikes":0,"_id":"4da23faa2264ef7b9defbdac","base_price":null,"category":{"name":"1031","id":530,"restful_path":"/categories/530"},"category_id":530,"created_at":null,"description":"Rock / grau, weiß\r\n\r\n[ m a t e r i a l ]\r\n100 % wolle (leichte sommerwolle)\r\n\r\n[ d e t a i l s ]\r\nasymmetrisch\r\npatchwork design\r\nlagenlook\r\n\r\n[ s i z e s ]\r\nXS, S, M, L \r\n\r\n[ c a r e ]\r\nschonwäsche 30°C, mit ähnlichen farben waschen, nicht bleichen, nicht im wäschetrockner trocknen, bügeln mit mittlerer stufe\r\n\r\n[ s i z e c h a r t ]\r\n\r\n(size chart women)\r\n\r\nx-small \r\n
brust: (76-80 cm) 
\r\ntaille: (60-64 cm) 
\r\nhüfte: (84-88 cm)\r\n\r\nsmall 
\r\nbrust: (84-88 cm) 
\r\ntaille: (68-72 cm) 
\r\nhüfte: (92-96 cm)\r\n\r\nmedium 
\r\nbrust: (92-96 cm) 
\r\ntaille: (76-80 cm) 
\r\nhüfte: (100-104 cm)\r\n\r\nlarge 
\r\nbrust: (100-104 cm) 
\r\ntaille: (84-88 cm) 
\r\nhüfte: (108-112 cm)\r\n","ending":null,"id":9709590,"materials":"","name":"1.01 (all your summer songs)","product_url":"http://de.dawanda.com/product/9709590-101-all-your-summer-songs","quantity":1,"restful_path":"/products/9709590","tags":""});

Я думаю, что JSON в порядке, если вы конвертируете его в ANSI, но кажется, что он сломан в utf-8.

Объект строковый на стороне сервера с JSON.stringify после загрузки из MongoDB через Mongoose.

Пример сбоя запроса json: http://like -my-style.com / #! Single / 9709590 . Он отлично работает для других продуктов.

1 Ответ

2 голосов
/ 18 апреля 2011

if(data == undefined || data == null) data = {};

data == null проверяет оба значения null и undefined, поэтому вам нужно проверить только одно, а не оба.

Что касается вашей фактической проблемы, то этокажется, что ваш код узла не создает правильные данные JSON.попробуйте использовать JSON.stringify для создания своего ответа, чтобы иметь уверенность в том, что он действителен в формате json.

Подмножество ваших данных - "weiß" - попробуйте удалить все нестандартные символы из вашего описания и посмотрите, решит ли это проблему.прочь.

...