2010-10-05 43 views
34

Necesito hacer una solicitud POST jsonp con el tipo de contenido 'application/json'. Puedo obtener la solicitud POST al servidor de esta manera:¿Cómo hacer una solicitud POST jsonp que especifique contentType con jQuery?

 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', 
     }); 

Pero tan pronto como puedo añadir la línea: contentType: "application/json" se empieza a enviar como una solicitud de OPCIONES en lugar de un POST.

¿Cómo puedo especificar el tipo de contenido y seguir enviando la solicitud como POST?

+0

¿El URL está en su dominio? ¿Qué formato devuelve? – SLaks

Respuesta

51

No es posible realizar una solicitud JSONP POST.

JSONP funciona creando una etiqueta <script> que ejecuta Javascript desde un dominio diferente; no es posible enviar una solicitud POST usando una etiqueta <script>.

+0

Si omito el contentType, la solicitud se realiza y el servidor la obtiene como POST. – Marcus

+6

Sí, jQuery recurre a XMLHttpRequest ya que no se puede POSTAR a través de la inclusión '

0

Hay una solución (pirateo) que he hecho muchas veces, podrás Publicar con JsonP. (Usted será capaz de publicar de forma, más grande que 2000 carbón que se puede utilizar por GET) Aplicación cliente

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

Al hacer esto, está abriendo su servidor a cualquier solicitud posterior, debe volver a proteger esto proporcionando ident u otra cosa.

Con este método, también se puede cambiar el tipo de solicitud de jsonp a JSON, tanto en el trabajo, acaba de establecer la respuesta correcta tipo de contenido

jsonp

response.setContentType("text/javascript; charset=utf-8"); 

JSON

response.setContentType("application/json; charset=utf-8"); 

Por favor, no se que su servidor ya no respetará el SOP (mismo orig en política), pero ¿a quién le importa?

+3

Creo que de lo que estás hablando está realmente usando CORS. Al establecer esos encabezados, está activando que el cliente inicie una solicitud de CORS. No necesariamente describiría eso como un "truco"; esa es la forma en que debería hacerse. Además, no recomendaría usar "*", sino que repetiría el origen del cliente y verificaría en la lista blanca el servidor. Consulte aquí para obtener más detalles: http://enable-cors.org/server.html – occasl

5

Uso json en dataType y enviar la siguiente manera:

 $.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); 
      } 
     }); 

y poner estas líneas en su archivo del lado del servidor:

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

¿Hay algún problema de seguridad relacionado con esto? – Notflip

Cuestiones relacionadas