38 votes

Comment faire une requête POST jsonp qui spécifie contentType avec jQuery?

J'ai besoin de faire une requête POST jsonp avec le type de contenu 'application / json'. Je peux envoyer la requête POST au 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 OPTIONS plutôt que comme un POST.

Comment puis-je spécifier le type de contenu et toujours soumettre la demande en tant que POST?

51voto

SLaks Points 391154

Il n'est pas possible de faire une demande JSONP POST.

JSONP fonctionne en créant une balise <script> qui exécute Javascript à partir d'un domaine différent; il n'est pas possible d'envoyer une demande POST à l'aide d'une balise <script> .

7voto

Pratik Butani Points 4290

Utilisez json en dataType et envoyez 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 mettez ces lignes dans votre fichier côté serveur:

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

1voto

BigDong Points 46

Il y a un (hack) la solution je l'ai fait à de nombreuses reprises, 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 agissant de la sorte, vous êtes à l'ouverture de votre serveur pour toute demande de publication, vous devez re-mettre en fournissant ident ou quelque chose d'autre.

Avec cette méthode, vous pouvez également modifier le type de demande de jsonp en json, tous les deux, il suffit de régler le droit de réponse de type de contenu

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 ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X