Parserfehler nach jQuery.ajax-Anfrage mit jsonp-Inhaltstyp

Lesezeit: 5 Minuten

Parserfehler nach jQueryajax Anfrage mit jsonp Inhaltstyp
Thomas

Ich verwende jQuery Version 1.5.1, um den folgenden Ajax-Aufruf auszuführen:

$.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); }
});

Der Server antwortet mit einem gültigen JSON-Objekt:

{
  "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"
       }
     }
   }
 }

Aber der Erfolgs-Callback wird nie aufgerufen, stattdessen erzeugt der Fehler-Callback diese Ausgabe:

jQuery15109935275333671539_1300495251986 was not called
parsererror

Warum passiert das?

Ich verwende keine zusätzlichen Bibliotheken zu jQuery.

BEARBEITEN:

Wenn ich versuche, den Ajax-Aufruf mit “json” als dataType anstelle von “jsonp” durchzuführen, antwortet der Server mit einem leeren String.

1643970666 347 Parserfehler nach jQueryajax Anfrage mit jsonp Inhaltstyp
Evan Trimboli

JSONP erfordert, dass die Antwort in eine Art Callback-Funktion verpackt wird, da es funktioniert, indem es ein Skript-Tag in das Dokument einfügt, um Daten aus einer anderen Domäne zu laden.

Im Wesentlichen wird ein Skript-Tag wie folgt dynamisch in das Dokument eingefügt:

<script src="http://the.other.server.com/foo?callback=someFn"></script>

callback von der Ressource abhängt, die Sie aufrufen, ist es üblich, dass der Parameter lautet callback obwohl.

someFn wird dann verwendet, um die vom Server zurückgegebenen Daten zu verarbeiten, daher sollte der Server antworten mit:

someFn({theData: 'here'});

Das someFn wird als Teil der Anfrage übergeben, daher muss der Server es lesen und die Daten entsprechend umschließen.

Dies alles setzt voraus, dass Sie den Inhalt von einer anderen Domain abrufen. Wenn dies der Fall ist, sind Sie durch dieselbe Ursprungsrichtlinie eingeschränkt: http://en.wikipedia.org/wiki/Same_origin_policy

  • Die fragliche API ist eine öffentliche API eines Anbieters. Es beschränkt die Aufrufe nur auf jsonp. Jsonp-Aufrufe werden beantwortet, aber als normales Json-Objekt.

    – Thomas

    19. März 11 um 12:44 Uhr

  • In diesem Beispiel ist someFn der Callback und der Server sollte antworten mit: jQuery15109935275333671539_1300495251986({…});

    – Adam Morris

    24. März 11 um 15:29 Uhr

  • Gott sei Dank, ich wünschte, sie würden eine verdammte Dokumentation hinzufügen

    – Kevin

    19. November 13 um 21:55 Uhr

  • Ich kann diesen nicht verstehen. Sie meinen, ich muss die Antwort vom Server umschließen, zB mit: $callBack({$myJsonResult}); Ich werde das auf der Serverseite tun?

    – PinoyStackOverflower

    20. Mai ’14 um 8:15 Uhr

  • @AdamMorris Woher soll der Server die Funktion kennen? Ich meine diese lange Zahl in jQuery15109935275333671539_1300495251986 ? Wie geben Sie diese Informationen an den Server weiter?

    – StallingOne

    20. Juni 18 um 9:17 Uhr


1643970666 11 Parserfehler nach jQueryajax Anfrage mit jsonp Inhaltstyp
Bryan

Nach dem Upgrade auf Jquery 1.5 und dem Versuch, einen Anruf über Domänen hinweg zu tätigen, hatte ich das gleiche Problem. Schließlich fand ich, dass $.getJSON funktionierte. Speziell,

$.getJSON(url,
    function(data){
        yourFunction(data);
       return false;
    });

Die URL, die ich verwendet habe, war wie folgt:

var url = WEB_SERVER_URL;
url = url + "&a=" + lat;
url = url + "&b=" + lng; ....
url = url + "&jsoncallback=?";

In dem Server, der auf einem anderen Server läuft und ich die Kontrolle habe, wurde dieser Code hinzugefügt:

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);
}

(Das json-Objekt ist eine Instanz von JSONObject, den Code finden Sie hier http://www.json.org/java/)

1643970666 878 Parserfehler nach jQueryajax Anfrage mit jsonp Inhaltstyp
Rohit

Wenn Sie jsonp als Datentyp verwenden (domänenübergreifende Anfrage stellen), generiert Jquery eine zufällige Funktion und fügt an die angeforderte URL als Abfragezeichenfolge mit dem Namen Callback (callback=?) an, müssen Sie die JSON-Antwortdaten als Parameter dieser Funktion wie unten angegeben anhängen –

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

Antwortdaten sollten wie folgt aussehen:

 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));

Lesen Sie mehr über: Parserfehler nach jquery.ajax-Anforderung mit jsonp-Inhaltstyp

Geben Sie hier die Bildbeschreibung ein

Es gibt einen kleinen Fehler 🙂 Sie müssen .js und nicht .json anfordern.

$.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); }
});

Ah und ist dir aufgefallen, dass es einen Client für die API gibt? https://github.com/dawanda/dawanda-api-client-js

Du solltest wirklich nicht angeben jsonp Hier. Benutz einfach json weil Sie gerade eine JSON-Zeichenfolge erhalten. json (json with padding) erwartet die Ausführung einer Javascript-Funktion. In diesem Fall müssen Sie in Ihrem Abfragestring ein “callback=” angeben. Ich denke, das ist der Grund, warum jQuery das auch nicht verarbeiten kann, es gibt eine Eigenschaft mit dem Namen Callback.

  • Ich bekomme einen leeren String als Antwort, wenn ich nur json für die Anfrage verwende. Kann es sein, dass die API kaputt ist? Und wenn ja, gibt es eine Möglichkeit, dies in js zu hacken?

    – Thomas

    19. März 11 um 1:20 Uhr


  • du meinst “jsonp (json with padding)”, nicht “json (json with padding)”

    – Bär

    27. März 13 um 13:49 Uhr

1643970667 118 Parserfehler nach jQueryajax Anfrage mit jsonp Inhaltstyp
Adam

Versuchen Sie, die Antwort mit $.parseJSON in ein Objekt einzulesen:

success: function(data) {
    var json = $.parseJSON(data);
}

  • Ich bekomme einen leeren String als Antwort, wenn ich nur json für die Anfrage verwende. Kann es sein, dass die API kaputt ist? Und wenn ja, gibt es eine Möglichkeit, dies in js zu hacken?

    – Thomas

    19. März 11 um 1:20 Uhr


  • du meinst “jsonp (json with padding)”, nicht “json (json with padding)”

    – Bär

    27. März 13 um 13:49 Uhr

1643970667 864 Parserfehler nach jQueryajax Anfrage mit jsonp Inhaltstyp
Wilhelm

Stellen Sie sicher, dass der aufgerufene Dienst Daten im JsonP-Format zurückgeben kann.

Wenn Sie asp.net webapi verwenden, können Sie WebApiContrib.Formatting.Jsonp verwenden, es ist Open Source.

Stellen Sie sicher, dass Sie eine Zeile wie unten in WebApiConfig.Register haben.

config.Formatters.Insert(0, new JsonpMediaTypeFormatter(new JsonMediaTypeFormatter(), “callback”));

Ich habe meine Haare darüber gezogen. Hoffe, das hilft jemandem.

.

767990cookie-checkParserfehler nach jQuery.ajax-Anfrage mit jsonp-Inhaltstyp

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy