Не могат да се прочетат данни от извикване на AJAX (dataType:jsonp) към уеб услуга

Използвам ajax повиквания за извършване на POST и GET операции от WebService, хостван на някакъв сървър.

Използвам dataType:"jsonp" поради проблема с кръстосания домейн. Виждам данните, изпратени от уеб услугата на fiddler. Искам да получа достъп до данните, които получавам от услугата, и не знам как да го направя.

Това е моето ajax обаждане:

    $.ajax({
        type: method,
        url: "url",
        contentType: "application/json; charset=utf-8",
        dataType: "jsonp",
        jsonp: false,
        jsonpcallback:function(data){},            //What am I supposed to write here so that I can get the JSON data from Padded json
        success: successHandler,
        error: errorHandler
    });

Това е приближението на json отговора, който получавам от услугата:

    {"Ideas":[
               {"Message":null,"IdeaId":1},
               {"Message":null,"IdeaId":1}
             ]
    }  

Всякакъв вид помощ ще бъде високо оценена. Търсих в много публикации, но не можах да стигна.

Благодаря ви предварително.


person Abhishek J    schedule 16.11.2012    source източник
comment
Обикновено не се нуждаете от опциите jsonp или jsonpcallback, за да изпратите jsonp заявка. Без тях това, което имате, трябва да работи при нормална jsonp уеб услуга. Освен това уеб услугата трябва да върне json във формат jsonp, а не json. Това, което имате по-горе, е json, а не jsonp.   -  person Kevin B    schedule 17.11.2012
comment
много API не поддържат jsonp... уверете се, че този, който викате, го прави. Ако е само JSON, ще видите отговора, но защитата на браузъра няма да позволи използването му   -  person charlietfl    schedule 17.11.2012
comment
Проблемът е, че когато посоча dataType:json, не получавам никакъв отговор от услугата. И когато посоча jsonp, виждам отговора, получен от моето локално приложение. Но проблемът е, че показва грешка :200parser, въпреки че виждам json данни в fiddler. Объркан съм и имам нужда от помощ относно това.   -  person Abhishek J    schedule 17.11.2012
comment
@AbhishekJ прочети какво съм написал по-внимателно. Ако API не върне JSONP, ще трябва да използвате други методи за извличане на данни.   -  person charlietfl    schedule 17.11.2012
comment
Бихте ли ми помогнали с това. Тъй като моята услуга не поддържа и не връща jsonp, тогава как да направя успешно извикване на услуга, без да посочвам dataType като jsonp?   -  person Abhishek J    schedule 17.11.2012


Отговори (4)


jsonpcallback:function(data){}, //Какво трябва да напиша тук, за да мога да получа JSON данните от Padded json

Обикновено нищо. Трябва само да посочите обратното извикване, ако вашата JSONP услуга е наистина нетипична. Ако го посочите, той трябва да е низ.

По същия начин не трябва да задавате jsonp: false, тъй като това ще попречи на генерирането на параметъра за обратно извикване.

Все пак се нуждаете от успешен манипулатор, който да обработва данните. Наличието на манипулатор на грешки също е добра идея.

function successHandler(data) {
    console.log(data)
}

function errorHandler(jqXHR, errorType, exception) {
    console.log(errorType, exception);
}

$.ajax({
    url: "url", // Make this the real URL!
    dataType: "jsonp",
    success: successHandler,
    error: errorHandler
});

Тогава манипулаторът на JSONP трябва действително да върне JSONP

Заглавието Content-Type, върнато от сървъра, трябва да бъде application/javascript

Тялото трябва да бъде:

  • Стойността на ключа callback в низа на заявката
  • (
  • Някои JSON
  • );

e.g.

jqueryCallback123u54yiyioeuioey8({ "foo": "bar" });
person Quentin    schedule 16.11.2012
comment
Но какво ще стане, ако данните, които виждам на fiddler, са от тип json, а не jsonp? Поправи ме ако греша. Трябва ли да мога да видя и формата jsonp на fiddler? - person Abhishek J; 17.11.2012
comment
Ако данните са JSON, те не са JSONP. Ако не е JSONP, тогава не можете да го заредите като JSONP. Трябва да можете да използвате fiddle, за да видите каквито и данни да са изпратени. - person Quentin; 17.11.2012
comment
Данните, които се изпращат, са json, а не jsonp. Но проблемът е, че когато посоча dataType: json, не получавам никакъв отговор от услугата (неуспешното повикване на услугата е грешката). Но когато посоча dataType:jsonp, виждам данните във формат json. Моля, помогнете ми с това, тъй като се боря с това от дълго време. - person Abhishek J; 17.11.2012
comment
Не можете да накарате браузъра да извлича данни от сайт на трета страна и да ги излага на вашия JavaScript, без сайтът на трета страна да съдейства (напр. като представя данните като JSONP). Това е мярка за сигурност, за да попречите на сайта на Joe Random да получава достъп до другия сайт на Joe Random с идентификационните данни на собственика на браузъра. - person Quentin; 17.11.2012
comment
Ако не е необходимо да получавате данните с идентификационните данни на потребителя, можете или да проксиирате през същия източник, или да използвате друг отдалечен източник, който ще го проксира и ще кодира повторно данните като JSONP. - person Quentin; 17.11.2012
comment
Можех да комуникирам с услугата, когато беше хоствана на моя локален IIS сървър с помощта на dataType:json. Но когато хоствах уеб услугата в облак Azure, не можах да използвам услугата с помощта на dataType:json. Каква е причината за това? - person Abhishek J; 17.11.2012
comment
Тъй като браузърите са щастливи да изложат данните от даден уебсайт на този уебсайт. Ако хоствате данните на друг уебсайт, те ги ограничават, за да защитят потребителите. Например, не би било добре, ако уебсайт може да използва JavaScript, за да чете данните на уебсайта на моята банка … когато съм влязъл. - person Quentin; 17.11.2012
comment
Така че единствената възможност, която имам, е да направя промени в моята уеб услуга, така че да поддържа jsonp. Прав ли съм? - person Abhishek J; 17.11.2012
comment
Други опции включват гореспоменатия прокси и CORS. - person Quentin; 17.11.2012

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

$.ajax({
    type: method,
    url: "url",
    dataType: "jsonp",
    success: function(data){
        console.log(data);
    }
});
person Anton Egorov    schedule 16.11.2012
comment
:Хей, опитах това, но не ми се получи. Все пак благодаря за помощта. - person Abhishek J; 17.11.2012

Получих това и стартирах по следния начин:

<script type="text/javascript">

  var jsonpCallback;

  function checkDocId() {
    // AJAX request
    $.ajaxSetup({ cache: false });

    jsonpCallback = function(data) {
      $("#result").html(data.html);
    };

    $.ajax({
      type: "GET",
      url: "/secudok/ws/rest/checkdocid/jsonp/" + encodeURIComponent($("#docId").val()),
      dataType: "jsonp",
      jsonpCallback: "jsonpCallback",
      crossDomain: true
    });
  }

</script>

Сървърът връща данните, обвити във функцията за обратно извикване: функция({JSON}).

jsonpCallback({"html":"<table>data</table>\n"})

В моя пример използваме HTML, но може да бъде и JSON

yourCallbackName({"a":"1"; "b":"2"})
person David    schedule 16.11.2012
comment
Uncaught SyntaxError: Unexpected token : е грешката, която получавам, когато използвам горния код. Мисля, че jquery не може да анализира отговора, тъй като очаква jsonp, но получава json и следователно не може да обработва json данните. - person Abhishek J; 17.11.2012
comment
Просто поставям изхода в моя контейнер div $("#result").html(data.html). Какво се опитвате да направите с отговора? Тогава мога да проверя това. - person David; 17.11.2012

Трябва да използвате своята конзола. напр. firebug ако използвате firefox или chrome's development console.

Там трябва да видите грешки в кода си.

ajax()

функцията в jquery приема success: function(data){ // do something with the data } обратно извикване.

console.log(//some data) 

е за регистриране на различни данни в различни точки на вашия скрипт.

So

$.ajax({
    type: method,
    url: "url",
    dataType: "jsonp",
    success: function(data){
    console.log(data);
}

});

Не е толкова лоша идея.

person tonino.j    schedule 16.11.2012
comment
Да, видях конзолата в Chrome. Грешката, която се показва е Uncaught SyntaxError: Unexpected token: в конзолата. Предполагам, че jquery не може да анализира отговора, тъй като очаква jsonp, но получава json и следователно се обърква между 2-те. - person Abhishek J; 17.11.2012