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?

35
demandé sur Marcus 2010-10-05 04:28:27

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.

51
répondu SLaks 2010-10-05 00:29:36

Utiliser jsondataType 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" );
6
répondu Pratik Butani 2013-07-18 11:20:23

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 ?

1
répondu BigDong 2013-04-29 09:27:31