Comment faire une requête POST jsonp qui spécifie contentType avec jQuery?
je dois faire une requête JSONP POST avec le type de contenu 'application / json'. Je peux obtenir de la requête POST vers le serveur comme ceci:
jQuery.ajax({
type: 'POST',
url: url,
data: data,
success: success,
error: error,
async: true,
complete: complete,
timeout: TIMEOUT,
scriptCharset: 'UTF-8',
dataType: 'jsonp',
jsonp: '_jsonp',
});
Mais dès que j'ajoute la ligne:contentType: "application/json"
il commence à l'envoyer comme une requête D'OPTIONS plutôt qu'un message.
Comment puis-je spécifier le type de contenu et quand même soumettre la demande en tant que POST?
3 réponses
il n'est pas possible de faire une requête JSONP POST.
JSONP fonctionne en créant un <script>
balise qui exécute Javascript à partir d'un domaine différent; il n'est pas possible d'envoyer une requête POST en utilisant un <script>
balise.
Utiliser json
dataType
et l'envoyer comme ceci:
$.ajax({
url: "your url which return json",
type: "POST",
crossDomain: true,
data: data,
dataType: "json",
success:function(result){
alert(JSON.stringify(result));
},
error:function(xhr,status,error){
alert(status);
}
});
et de mettre ces lignes dans votre côté serveur de fichier:
si PHP:
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST');
header('Access-Control-Max-Age: 1000');
si java:
response.addHeader( "Access-Control-Allow-Origin", "*" );
response.addHeader( "Access-Control-Allow-Methods", "POST" );
response.addHeader( "Access-Control-Max-Age", "1000" );
il y a une solution (hack) Je l'ai fait plusieurs fois, vous serez en mesure de poster avec JsonP. (Vous serez en mesure de publier Forme, plus grand que 2000 char que vous pouvez utiliser par GET)
application Client Javascript
$.ajax({
type: "POST", // you request will be a post request
data: postData, // javascript object with all my params
url: COMAPIURL, // my backoffice comunication api url
dataType: "jsonp", // datatype can be json or jsonp
success: function(result){
console.dir(result);
}
});
JAVA:
response.addHeader( "Access-Control-Allow-Origin", "*" ); // open your api to any client
response.addHeader( "Access-Control-Allow-Methods", "POST" ); // a allow post
response.addHeader( "Access-Control-Max-Age", "1000" ); // time from request to response before timeout
PHP:
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST');
header('Access-Control-Max-Age: 1000');
en faisant cela, vous ouvrez votre serveur à n'importe quelle requête post, vous devriez re-sécuriser ceci en fournissant ident ou quelque chose autre.
avec cette méthode, vous pouvez aussi changer le type de requête de jsonp à json, les deux fonctionnent, il suffit de définir le bon type de contenu de réponse
jsonp
response.setContentType( "text/javascript; charset=utf-8" );
json
response.setContentType( "application/json; charset=utf-8" );
s'il vous Plaît pas que vous êtes serveur n'aura plus de respect de la SOP (même origine), mais qui s'en soucie ?