2011-06-16 1 views
2

Я ищу способ вернуть одну строку JSON/JSONP из междоменного запроса «AJAX». Вместо того, чтобы запрашивать строку и JQuery автоматически возвращает ее как общий объект, я хочу получить строку перед тем, как произойдет преобразование. Цель здесь состоит в том, чтобы самостоятельно разобрать его, чтобы я мог превратить его прямо в новые объекты определенного типа (например, объект Person).Возвращаемая строка из запроса на перекрестный домен AJAX

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

Вот нерабочий пример того, что я хотел бы сделать:

$.ajax({ 
    type: 'GET', 
    url: 'http://www.someOtherDomain.com/GetPerson', 
    dataType: 'text', 
    success: parseToPerson 
}); 

function parseToPerson(textToParse) { 
    // I think I can do this part, I just want to get it working up to this point 
} 

Я совершенно счастлив, если JQuery не участвуют в решении тех пор, как она работает. Я бы предпочел использовать JQuery. Из того, что я прочитал, методы javascript, используемые для получения данных JSONP (динамическое создание элемента скрипта), вероятно, будут работать, но я не могу заставить это работать для меня. Я управляю доменом, с которого я запрашиваю данные, и могу получить данные, если я изменю тип данных в вызове AJAX на «JSONP», поэтому я знаю, что он работает.

+1

Мне удалось получить запрос JSONP для работы без использования JQuery. Метод включает добавление тега скрипта с src, указывающим на URL-адрес, который отправляет данные. Это не будет работать для меня, если я не использую type = "application/x-javascript". Это запускает его сразу, и поэтому данные создаются как общий объект, прежде чем я могу что-то с этим сделать. – BDawg

ответ

1

Если данные загружаются из другого домена, вам нужно будет использовать JSONP (есть и другие варианты, но JSONP на сегодняшний день является самым легким, если вы контролируете обслуживание). Вызов JQuery будет выглядеть следующим образом:

$.ajax({ 
    // type: 'GET', --> this is the default, you don't need this line 
    url: 'http://www.someOtherDomain.com/GetPerson', 
    dataType: 'jsonp', 
    success: parseToPerson 
}); 

Фактический запрос, который идет к вашим услугам будет http://www.someOtherDomain.com/GetPerson?callback=arbitrary_function_name. На стороне службы, вам нужно будет возвращать данные, как это:

arbitrary_function_name("the string (or JSON data) that I want to return"); 

Так что вам необходимо проверить параметры строки запроса, получить значение параметра callback, и эхо его, как если вы звоните Javascript с этим именем (которое вы есть), передавая значение, которое вы хотите предоставить через службу. Затем ваша функция success будет вызвана с данными, предоставленными вами.

Если вы десериализация возвращаемых данных в объект Javascript, вы могли бы быть лучше возвратом данных в формате JSON, чем строка, так что ваши данные возвращает сервис могут выглядеть следующим образом:

arbitrary_function_name({ 
    "name":"Bob Person", 
    "age":27, 
    "etc":"More data" 
}); 

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

+0

Итак, вы говорите, что я мог бы сериализовать свои данные в службе как строку JSON, а затем продолжить обертку в формате JSONP? Я предполагаю, что когда дело доходит до клиента, он передаст строку JSON функции обратного вызова. Это неплохая идея. Думаю, у меня также была бы возможность отправить строку, отличную от JSON, которая могла бы позволить мне просто использовать eval в функции обратного вызова для создания новых объектов Person.Я думаю, что это будет более эффективное решение как на скорости, так и на использовании памяти на стороне клиента. Думаю, ты нашел мой ответ, мой друг, спасибо. – BDawg

+0

@BDawg - Когда вы используете JSONP, вы фактически используете код, возвращаемый службой. Поэтому вам не нужно использовать 'eval' - когда ваш сервис выплескивает« callback »({« some »:« data »});', функция 'success' фактически получает объект Javascript. Таким образом, вы могли бы, теоретически, вернуть полноценные объекты Person, но вы могли бы отделить внимание лучше, возвращая данные и создавая экземпляр человека на стороне клиента. – nrabinowitz

+0

@nrabinowitz - Ах, это было не то, что вы имели в виду. В любом случае, я нашел ответ. Код JSONP будет кормить строку, содержащую код Javascript, функции обратного вызова, а не объект в этом случае. Таким образом, служба будет выплевывать что-то более похожее на это: 'callback (" [new Person (\ "John \": \ "Doe \")] ");' Я не уверен, что это считается плохой практикой или нет, но он, безусловно, отвечает на мой вопрос о том, как это возможно. – BDawg

0

Не знаете, как это будет работать в сочетании с jsonp, но, может быть, converters - это то, что вы ищете?

$.ajax(url, { 
    dataType: "person", 
    converters: { 
    "text person": function(textValue) { 
     return parseToPerson(textValue); 
    } 
    } 
}); 
+0

Пробовал, и JQuery пытается использовать XMLHttpRequest для извлечения данных. К сожалению, это не работает с данными, поступающими из другого домена. Спасибо хоть. Любые другие идеи? – BDawg

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

  • Нет связанных вопросов^_^