Mon code ajax est
$.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.');
}
});
Il s'agit d'une demande ajax interdomaine.
Je reçois une réponse correcte pour la demande, tout en vérifiant avec firebug je peux voir cette réponse.
Ceci est la réponse que j'obtiens dans la réponse Firebug et en accédant à cette URL via un navigateur Web
{"AuthenticateUserResult":"{\"PKPersonId\":1234,\"Salutation\":null,\"FirstName\":\"Miqdad\",\"LastName\":\"Kumar\",\"Designation\":null,\"Profile\":\"\",\"PhotoPath\":\"\/UploadFiles\/\"}"}
Mais je reçois une erreur
SyntaxError: invalid label
{"AuthenticateUserResult":"{\"PKPersonId\":8970,\"Salutation\
Si j'ai besoin d'utiliser une autre méthode pour le faire fonctionner. Je veux implémenter cela dans l'application mobile phonegap + jquery.
De plus, je n'ai aucun accès au service Web
Si je désactive chrome sécurité web ça marche bien
On dirait que la structure JSON interne est transmise sous forme de chaîne. Vous devrez le JSON.parse () une fois de plus pour obtenir ces données en tant qu'objet.
try {
responseData = JSON.parse(responseData);
}
catch (e) {}
Modifier: essayez ce qui suit:
$.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.');
}
});
Malheureusement, il semble que ce service Web renvoie JSON qui contient un autre JSON - l'analyse du contenu du JSON interne a réussi. La solution est moche mais fonctionne pour moi. JSON.parse(...)
essaie de convertir la chaîne entière et échoue. En supposant que vous obtenez toujours la réponse commençant par {"AuthenticateUserResult":
et des données intéressantes sont après cela, essayez:
$.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.');
}
});
Il est très important que dataType
soit text
pour empêcher l'analyse automatique du JSON mal formé que vous recevez du service Web.
Fondamentalement, j'efface le JSON externe en supprimant les accolades les plus hautes et la clé AuthenticateUserResult
ainsi que les guillemets de début et de fin. Le résultat est un JSON bien formé, prêt pour l'analyse.
La réponse du serveur est au format JSON String. Si le dataType défini comme 'json' jquery tentera de l'utiliser directement. Vous devez définir dataType comme "texte", puis l'analyser manuellement.
$.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.');
}
});
Si vous prévoyez d'utiliser JSONP
, vous pouvez utiliser getJSON
, ce qui est fait pour cela. jQuery a des méthodes d'assistance pour JSONP
.
$.getJSON( 'http://someotherdomain.com/service.svc&callback=?', function( result ) {
console.log(result);
});
Lisez les liens ci-dessous
http://api.jquery.com/jQuery.getJSON/
Lorsque vous utilisez "jsonp", vous renvoyez essentiellement des données enveloppées dans un appel de fonction, quelque chose comme
jsonpCallback([{"id":1,"value":"testing"},{"id":2,"value":"test again"}])
where the function/callback name is 'jsonpCallback'.
Si vous avez accès au serveur, veuillez d'abord vérifier que la réponse est dans le bon "jsonp"
format
Pour une telle réponse provenant du serveur, vous devez également spécifier quelque chose dans l'appel ajax, quelque chose comme
jsonpCallback: "jsonpCallback", in your ajax call
Veuillez noter que le nom du rappel n'a pas besoin d'être "jsonpCallback
" c'est juste un nom choisi comme exemple mais il doit correspondre au nom (habillage) fait côté serveur.
Ma première supposition à votre problème est que la réponse du serveur n'est pas ce qu'elle devrait être.
Voici les extraits de mon code .. Si cela résout vos problèmes ..
Définissez jsonpCallBack: 'photos' et 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);
};
@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
}
Il vous suffit d'analyser la chaîne en utilisant JSON.parse comme ceci:
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);
Ici, vous aurez quelque chose comme ça:
Designation
null
FirstName
"Miqdad"
LastName
"Kumar"
PKPersonId
1234
PhotoPath
"/UploadFiles/"
Profile
""
Salutation
null
Et pour la demande, n'oubliez pas de définir dataType:'jsonp'
et pour ajouter un fichier dans le répertoire racine de votre site appelé crossdomain.xml
et contenant:
<?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>
EDIT pour prendre soin de Sanjay Kumar POST
Vous pouvez donc définir la fonction de rappel à appeler dans le JSONP en utilisant jsonpCallback
!
$.Ajax({
jsonpCallback : 'your_function_name',
//OR with anonymous function
jsonpCallback : function(data) {
//do stuff
},
...
});