webentwicklung-frage-antwort-db.com.de

parsererror nach jQuery.ajax-Anforderung mit jsonp-Inhaltstyp

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

Der Erfolgsrückruf wird jedoch nie aufgerufen, sondern der Fehlerrückruf erzeugt diese Ausgabe:

jQuery15109935275333671539_1300495251986 was not called
parsererror

Warum passiert das?

Ich verwende keine zusätzlichen Bibliotheken für jQuery.

BEARBEITEN:  

Wenn ich versuche, den Ajax-Aufruf mit "Json" als Datentyp anstelle von "Jsonp" auszuführen, antwortet der Server mit einer leeren Zeichenfolge.

55
Thomas

Für JSONP ist es erforderlich, dass die Antwort in eine Art Callback-Funktion eingeschlossen wird, da sie ein Skript-Tag als Mechanismus zum Laden von Daten aus einer anderen Domäne in das Dokument einfügt.

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 ist abhängig von der Ressource, die Sie aufrufen, es ist jedoch üblich, dass der Parameter callback ist.

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

someFn({theData: 'here'});

SomeFn wird als Teil der Anforderung übergeben, sodass der Server sie lesen und die Daten entsprechend umschließen muss.

Dies alles setzt voraus, dass Sie den Inhalt von einer anderen Domain beziehen. Wenn ja, sind Sie durch dieselbe Origin-Richtlinie eingeschränkt: http://en.wikipedia.org/wiki/Same_Origin_policy

56
Evan Trimboli

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, habe ich die Kontrolle über diesen 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/ )

9
Bryan

wenn Sie jsonp als Datentyp verwenden (um eine domänenübergreifende Anforderung zu erstellen). Jquery generiert eine Zufallsfunktion und fügt an, eine URL als Abfragestring mit dem Namen callback (callback =?) anzufordern. Sie müssen die Antwort-json-Daten als Parameter dieser Funktion anfügen, wie unten angegeben -

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 so 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:Parsererror nach jquery.ajax-Anforderung mit jsonp-Inhaltstyp

enter image description here

6
Rohit

es gibt einen kleinen Fehler :) Sie müssen .js anfordern und nicht .json.

$.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 hast du bemerkt, dass es einen Kunden für die API gibt? https://github.com/dawanda/dawanda-api-client-js

3
sdepold

Stellen Sie sicher, dass der Dienst, den Sie anrufen, 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 in WebApiConfig.Register eine Zeile wie unten angegeben haben.

config.Formatters.Insert (0, neuer JsonpMediaTypeFormatter (neuer JsonMediaTypeFormatter (), "Rückruf"));

Ich zog meine Haare darüber. Hoffe das hilft jemandem.

1
William

Sie sollten jsonp hier wirklich nicht angeben. Verwenden Sie einfach json , weil Sie nur eine JSON-Zeichenfolge erhalten. json (json with padding) erwartet, dass eine Javascript-Funktion ausgeführt wird. In diesem Fall müssen Sie eine "callback =" in Ihrer Querzeichenfolge angeben. Ich denke, das ist der Grund, warum jQuery dies auch nicht bewältigen kann. Es gibt eine Eigenschaft mit dem Namen callback.

1
jAndy

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

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

Nicht alle Server unterstützen Jsonp. Der Server muss die Callback-Funktion in den Ergebnissen festlegen. Ich verwende dies, um Json-Antworten von Sites zu erhalten, die reines Json zurückgeben, aber kein Jsonp unterstützen (aber vielleicht in der Zukunft):

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

Dasselbe Problem, das ich bekam, bis ich den Parameter "callback =?" Nicht angehängt habe. oder "c =?" in url.

Wie: " http://de.dawanda.com/api/v1/ " + resource + ".json & c =?" 

Kann Ihr Problem lösen. Es hat für mich funktioniert.

0
Parveen Verma