jsonp 콘텐츠 유형으로 jQuery.ajax 요청 후 parsererror
다음 ajax 호출을 수행하기 위해 jQuery 버전 1.5.1을 사용하고 있습니다.
$.ajax({
dataType: 'jsonp',
data: { api_key : apiKey },
url: "http://de.dawanda.com/api/v1/" + resource + ".json",
success: function(data) { console.log(data); },
error: function(jqXHR, textStatus, errorThrown) { console.log(errorThrown); console.log(textStatus); }
});
서버는 유효한 json 객체로 응답합니다.
{
"response": {
"type":"category",
"entries":1,
"params":{
"format":"json",
"api_key":"c9f11509529b219766a3d301d9c988ae9f6f67fb",
"id":"406",
"callback":"jQuery15109935275333671539_1300495251986",
"_":"1300495252693"
},
"pages":1,
"result":{
"category":{
"product_count":0,
"id":406,
"restful_path":"/categories/406",
"parent_id":null,
"name":"Oberteile"
}
}
}
}
그러나 성공 콜백은 호출되지 않고 대신 오류 콜백이 다음 출력을 생성합니다.
jQuery15109935275333671539_1300495251986 was not called
parsererror
왜 이런 일이 발생합니까?
jQuery에 추가 라이브러리를 사용하지 않습니다.
편집하다:
"jsonp"대신 "json"을 dataType으로 사용하여 ajax 호출을 시도하면 서버가 빈 문자열로 응답합니다.
JSONP는 다른 도메인에서 데이터를로드하는 메커니즘으로 문서에 스크립트 태그를 삽입하여 작동하기 때문에 응답을 일종의 콜백 함수로 래핑해야합니다.
기본적으로 스크립트 태그는 다음과 같이 문서에 동적으로 삽입됩니다.
<script src="http://the.other.server.com/foo?callback=someFn"></script>
callback
호출하는 리소스에 따라 다르지만 매개 변수가 일반적입니다 callback
.
someFn
그런 다음 서버에서 반환 된 데이터를 처리하는 데 사용되므로 서버는 다음과 같이 응답해야합니다.
someFn({theData: 'here'});
someFn은 요청의 일부로 전달되므로 서버는이를 읽고 데이터를 적절하게 래핑해야합니다.
이것은 모두 다른 도메인에서 콘텐츠를 가져오고 있다고 가정합니다. 그렇다면 동일한 출처 정책으로 제한됩니다. http://en.wikipedia.org/wiki/Same_origin_policy
Jquery 1.5로 업그레이드하고 도메인간에 호출을 시도한 후 동일한 문제가 발생했습니다. 결국 $ .getJSON이 작동하는 것을 발견했습니다. 구체적으로 특별히,
$.getJSON(url,
function(data){
yourFunction(data);
return false;
});
내가 사용한 URL은 다음과 같습니다.
var url = WEB_SERVER_URL;
url = url + "&a=" + lat;
url = url + "&b=" + lng; ....
url = url + "&jsoncallback=?";
다른 서버에서 실행중인 서버에서이 코드를 제어 할 수 있습니다.
PrintWriter writer = response.getWriter();
String jsonString = json.toString(JSON_SPACING);
String callback = request.getParameter("jsoncallback");
// if callback in URL and is not just the "?" (e.g. from localhost)
if (callback != null && callback.length() > 1)
{
writer.write(callback + "(" + jsonString + ");");
}
else
{
writer.write(jsonString);
}
(json 객체는 JSONObject의 인스턴스이며 코드는 http://www.json.org/java/ 에서 찾을 수 있습니다 . )
jsonp를 데이터 유형으로 사용하는 경우 (도메인 간 요청 만들기) Jquery는 임의의 함수를 생성하고 추가는 요청 된 URL에 callback (callback =?)이라는 쿼리 문자열로 요청 된 경우 아래와 같이이 함수의 매개 변수로 응답 json 데이터를 추가해야합니다. -
url : http://www.dotnetbull.com/cross-domain-call.ashx?ref=jquery-jsonp-request
url call by ajax :
http://www.dotnetbull.com/cross-domain-call.ashx?ref=jquery-jsonp-request&callback=jQuery1510993527567155793_137593181353
응답 데이터는 다음과 같아야합니다.
string callback = context.Request.QueryString["callback"];
if (!string.IsNullOrEmpty(callback))
context.Response.Write(string.Format("{0}({1});", callback, jc.Serialize(outputData)));
else
context.Response.Write(jc.Serialize(outputData));
자세히 알아보기 : jsonp 콘텐츠 유형이있는 jquery.ajax 요청 후 parsererror
약간의 실수가 있습니다. :) .json이 아닌 .js를 요청해야합니다.
$.ajax({
dataType: 'jsonp',
data: { api_key : apiKey },
url: "http://de.dawanda.com/api/v1/" + resource + ".js",
success: function(data) { console.log(data); },
error: function(jqXHR, textStatus, errorThrown) { console.log(errorThrown); console.log(textStatus); }
});
아 그리고 API에 대한 클라이언트가 있다는 것을 알았습니까? https://github.com/dawanda/dawanda-api-client-js
You really shouldn't specify jsonp here. Just use json because you're just receiving a JSON string. json (json with padding) expects a javascript function execute. In that case you need to specify a "callback=" within your querystring. I guess that is.the reason why jQuery can't handle this aswell, there is a property with the name callback.
Try reading the response into an object using $.parseJSON:
success: function(data) {
var json = $.parseJSON(data);
}
Ensure that the service you are calling has the ability to return data in JsonP format.
If you are using asp.net webapi, you can use WebApiContrib.Formatting.Jsonp, it's open source.
Ensure that you have a line like below in WebApiConfig.Register.
config.Formatters.Insert(0, new JsonpMediaTypeFormatter(new JsonMediaTypeFormatter(), "callback"));
I was pulling my hair over this. Hope this helps someone.
Not all servers support jsonp. It requires the server to set the callback function in it's results. I use this to get json responses from sites that return pure json but don't support jsonp (But might in the future):
function AjaxFeed(){
return $.ajax({
url: 'http://somesite.com/somejsonfile.php',
data: {something: true},
dataType: 'jsonp',
/* Very important */
contentType: 'application/json',
});
}
function GetData()
AjaxFeed()
/* Everything worked okay. Hooray */
.done(function(data){
return data;
})
/* Okay jQuery is stupid manually fix things */
.fail(function(jqXHR) {
/* Build HTML and update */
var data = jQuery.parseJSON(jqXHR.responseText);
return data;
});
}
The same problem I was getting until I have not appended parameter "callback=?" or "c=?" in url.
Like : "http://de.dawanda.com/api/v1/" + resource + ".json&c=?"
May solve your problem. It worked for me.
ReferenceURL : https://stackoverflow.com/questions/5359224/parsererror-after-jquery-ajax-request-with-jsonp-content-type
'Development Tip' 카테고리의 다른 글
EAGAIN은 무엇을 의미합니까? (0) | 2020.12.25 |
---|---|
jquery는 레일 표준 REST DELETE 응답에 대해 $ .ajax에서 성공 메서드를 호출하지 않습니다. (0) | 2020.12.25 |
클로저의 변수 캡처에 대한 자세한 설명 (0) | 2020.12.25 |
JavaScript의 구성, 상속 및 집계 (0) | 2020.12.25 |
내 jQuery : not () 선택기가 CSS에서 작동하지 않는 이유는 무엇입니까? (0) | 2020.12.25 |