it-swarm.com.de

jQuery Cross Domain Ajax

Mein Ajax-Code ist

$.ajax({
    type: 'GET',
    dataType: "jsonp",
    processData: false,
    crossDomain: true,
    jsonp: false,
    url: "http://someotherdomain.com/service.svc",
    success: function (responseData, textStatus, jqXHR) {
        console.log("in");
    },
    error: function (responseData, textStatus, errorThrown) {
        alert('POST failed.');
    }
});

Dies ist eine domänenübergreifende Ajax-Anfrage.

Ich erhalte die richtige Antwort für die Anfrage, während ich mit Firebug überprüfe, kann ich diese Antwort sehen.

Dies ist die Antwort, die ich in der Firebug-Antwort und beim Zugriff auf diese URL über den Webbrowser erhalte

{"AuthenticateUserResult":"{\"PKPersonId\":1234,\"Salutation\":null,\"FirstName\":\"Miqdad\",\"LastName\":\"Kumar\",\"Designation\":null,\"Profile\":\"\",\"PhotoPath\":\"\/UploadFiles\/\"}"}

Aber ich bekomme einen Fehler

SyntaxError: invalid label

{"AuthenticateUserResult":"{\"PKPersonId\":8970,\"Salutation\

Ob ich eine andere Methode verwenden muss, damit es funktioniert. Ich möchte dies in der mobilen App phonegap + jquery implementieren.

Außerdem habe ich keinen Zugriff auf den Webdienst

Wenn ich chrome web security deaktiviere, funktioniert es einwandfrei

14
Miqdad Ali

Sieht so aus, als ob die innere JSON-Struktur als Zeichenfolge übergeben wird. Sie müssen JSON.parse () erneut ausführen, um diese Daten als Objekt abzurufen.

try {
  responseData = JSON.parse(responseData);
}
catch (e) {}

Bearbeiten: Versuchen Sie Folgendes:

$.ajax({
    type: 'GET',
    dataType: "json",
    url: "http://someotherdomain.com/service.svc",
    success: function (responseData, textStatus, jqXHR) {
        console.log("in");
        var data = JSON.parse(responseData['AuthenticateUserResult']);
        console.log(data);
    },
    error: function (responseData, textStatus, errorThrown) {
        alert('POST failed.');
    }
});
7
EWit

Leider scheint es, dass dieser Webdienst JSON zurückgibt, das einen anderen JSON-Parsing-Inhalt des inneren JSON enthält. Die Lösung ist hässlich, funktioniert aber bei mir. JSON.parse(...) versucht die gesamte Zeichenkette zu konvertieren und schlägt fehl. Angenommen, Sie erhalten die Antwort immer beginnend mit {"AuthenticateUserResult": und interessante Daten sind danach, versuchen Sie:

$.ajax({
    type: 'GET',
    dataType: "text",
    crossDomain: true,
    url: "http://someotherdomain.com/service.svc",
    success: function (responseData, textStatus, jqXHR) {
        var authResult = JSON.parse(
            responseData.replace(
                '{"AuthenticateUserResult":"', ''
            ).replace('}"}', '}')
        );
        console.log("in");
    },
    error: function (responseData, textStatus, errorThrown) {
        alert('POST failed.');
    }
});

Es ist sehr wichtig, dass dataTypetext sein muss, um das automatische Parsen von fehlerhaftem JSON zu verhindern, das Sie vom Webdienst erhalten.

Grundsätzlich lösche ich den äußeren JSON durch Entfernen der obersten Klammern und des Schlüssels AuthenticateUserResult sowie der führenden und nachfolgenden Anführungszeichen. Das Ergebnis ist ein gut geformter JSON, der zum Parsen bereit ist.

6
ElmoVanKielmo

Die Antwort vom Server ist im JSON-String-Format. Wenn der Datentyp als 'json' festgelegt ist, versucht jquery, ihn direkt zu verwenden. Sie müssen dataType als 'Text' festlegen und dann manuell analysieren.

$.ajax({
    type: 'GET',
    dataType: "text", // You need to use dataType text else it will try to parse it.
    url: "http://someotherdomain.com/service.svc",
    success: function (responseData, textStatus, jqXHR) {
        console.log("in");
        var data = JSON.parse(responseData['AuthenticateUserResult']);
        console.log(data);
    },
    error: function (responseData, textStatus, errorThrown) {
        alert('POST failed.');
    }
});
4
Subir Kumar Sao

Wenn Sie vorhaben, JSONP zu verwenden, können Sie getJSON verwenden, das dafür vorgesehen ist. jQuery hat Hilfsmethoden für JSONP.

$.getJSON( 'http://someotherdomain.com/service.svc&callback=?', function( result ) {
       console.log(result);
});

Lesen Sie die folgenden Links

http://api.jquery.com/jQuery.getJSON/

Grundlegendes Beispiel für die Verwendung von .ajax () mit JSONP?

Grundlegende Vorgehensweise für domänenübergreifendes JSONP

3
Techie

Bei Verwendung von "jsonp" würden Sie im Grunde genommen Daten zurückgeben, die in einem Funktionsaufruf enthalten sind, wie z

jsonpCallback([{"id":1,"value":"testing"},{"id":2,"value":"test again"}])
where the function/callback name is 'jsonpCallback'.

Wenn Sie Zugriff auf den Server haben, vergewissern Sie sich zunächst, dass die Antwort im richtigen "jsonp" Format

Für eine solche Antwort vom Server müssten Sie auch etwas im Ajax-Aufruf angeben, so etwas wie

jsonpCallback: "jsonpCallback",  in your ajax call

Bitte beachten Sie, dass der Name des Rückrufs nicht "jsonpCallback" sein muss, sondern nur ein Name, der als Beispiel ausgewählt wurde, sondern mit dem Namen (Wrapping) übereinstimmen muss, der auf der Serverseite vorgenommen wurde.

Meine erste Vermutung zu Ihrem Problem ist, dass die Antwort vom Server nicht so ist, wie sie sein sollte.

0
PJR

Hier sind die Ausschnitte aus meinem Code .. Wenn es Ihre Probleme löst ..

Kundencode:

Setze jsonpCallBack: 'photos' und dataType: 'jsonp'

 $('document').ready(function() {
            var pm_url = 'http://localhost:8080/diztal/rest/login/test_cor?sessionKey=4324234';
            $.ajax({
                crossDomain: true,
                url: pm_url,
                type: 'GET',
                dataType: 'jsonp',
                jsonpCallback: 'photos'
            });
        });
        function photos (data) {
            alert(data);
            $("#Twitter_followers").html(data.responseCode);
        };

Serverseitiger Code (mit Rest Easy)

@Path("/test_cor")
@GET
@Produces(MediaType.TEXT_PLAIN)
public String testCOR(@QueryParam("sessionKey") String sessionKey, @Context HttpServletRequest httpRequest) {
    ResponseJSON<LoginResponse> resp = new ResponseJSON<LoginResponse>();
    resp.setResponseCode(sessionKey);
    resp.setResponseText("Wrong Passcode");
    resp.setResponseTypeClass("Login");
    Gson gson = new Gson();
    return "photos("+gson.toJson(resp)+")"; // CHECK_THIS_LINE
}
0
Sanjay Kumar

Sie müssen den String nur mit JSON.parse wie folgt analysieren:

var json_result = {"AuthenticateUserResult":"{\"PKPersonId\":1234,\"Salutation\":null,\"FirstName\":\"Miqdad\",\"LastName\":\"Kumar\",\"Designation\":null,\"Profile\":\"\",\"PhotoPath\":\"\/UploadFiles\/\"}"};

var parsed = JSON.parse(json_result.AuthenticateUserResult);
console.log(parsed);

Hier haben Sie so etwas:

Designation
null

FirstName
"Miqdad"

LastName
"Kumar"

PKPersonId
1234

PhotoPath
"/UploadFiles/"

Profile
""

Salutation
null

Und vergessen Sie nicht, für die Anfrage dataType:'jsonp' und zum Hinzufügen einer Datei im Stammverzeichnis Ihrer Website mit dem Namen crossdomain.xml und enthält:

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.Adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<!-- Read this: www.Adobe.com/devnet/articles/crossdomain_policy_file_spec.html -->

<!-- Most restrictive policy: -->
<site-control permitted-cross-domain-policies="none"/>

<!-- Least restrictive policy: -->
<!--
<site-control permitted-cross-domain-policies="all"/>
<allow-access-from domain="*" to-ports="*" secure="false"/>
<allow-http-request-headers-from domain="*" headers="*" secure="false"/>
-->
</cross-domain-policy>

BEARBEITEN, um Sanjay Kumar POST

Sie können also die Callback-Funktion, die im JSONP aufgerufen werden soll, mit jsonpCallback einstellen!

$.Ajax({
    jsonpCallback : 'your_function_name',
    //OR with anonymous function
    jsonpCallback : function(data) {
        //do stuff
    },
    ...
});
0
JoDev