Pregunta

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.js" type="text/javascript"></script>
<script>
$.get("http://example.com/", function(data) {
     alert(data);
});
</script>

lo hace una solicitud de OPCIONES a esa URL, y luego la devolución de llamada no se llama nunca con nada.

Cuando no es entre dominios, que trabaja muy bien.

No debería jQuery acaba de hacer la llamada con un nodo <script> y luego hacer la devolución de llamada cuando su carga? Yo entiendo que no voy a ser capaz de obtener el resultado (ya que es entre dominios), pero está bien; Sólo quiero la llamada para ir a través. Es esto un error, o estoy haciendo algo mal?

¿Fue útil?

Otros consejos

Según MDN ,

  

solicitudes de verificación previa

     

A diferencia de peticiones sencillas (discutido anteriormente), "verificación previa" peticiones primera   enviar un encabezado de solicitud HTTP OPTIONS al recurso en el otro   dominio, con el fin de determinar si la solicitud real es seguro   enviar. peticiones de dominio cruzado están verificación previa como éste, ya que pueden   tener implicaciones a los datos del usuario. En particular, una solicitud es   verificación previa si:

     
      
  • Utiliza métodos que no sean GET o POST. Además, si se usa el método POST para enviar   datos de la solicitud con un tipo de contenido que no sea   application / x-www-form-urlencoded, form-data multipart / o text / plain,   p.ej. si la solicitud POST envía una carga XML al servidor utilizando   application / xml o text / xml, entonces la petición es verificación previa.
  •   
  • Se establece encabezados personalizados en la solicitud (por ejemplo, la solicitud utiliza un encabezado como   X-PINGOTHER)
  •   

Si usted está tratando de Post

Asegúrese de JSON.stringify los datos del formulario y enviar como text/plain.

<form id="my-form" onSubmit="return postMyFormData();">
    <input type="text" name="name" placeholder="Your Name" required>
    <input type="email" name="email" placeholder="Your Email" required>
    <input type="submit" value="Submit My Form">
</form>

function postMyFormData() {

    var formData = $('#my-form').serializeArray();
    formData = formData.reduce(function(obj, item) {
        obj[item.name] = item.value;
        return obj;
    }, {});
    formData = JSON.stringify(formData);

    $.ajax({
        type: "POST",
        url: "https://website.com/path",
        data: formData,
        success: function() { ... },
        dataType: "text",
        contentType : "text/plain"
    });
}

No creo jQuery naturalmente hacer una solicitud JSONP cuando se le da una dirección URL de esa manera. Será, sin embargo, hacer una solicitud JSONP cuando usted le dice qué argumento va a utilizar para una devolución de llamada:

$.get("http://metaward.com/import/http://metaward.com/u/ptarjan?jsoncallback=?", function(data) {
     alert(data);
});

Es totalmente de la secuencia de comandos de recepción para hacer uso de ese argumento (que no tiene por qué ser llamado "jsoncallback"), por lo que en este caso no se llamará a la función. Pero, ya que se indique lo que desea la secuencia de comandos para ejecutar en metaward.com, que haría.

De hecho, AJAX entre dominios (xmlhttp) solicitudes no pueden por razones de seguridad (pensar en obtener una página web "restringida" del lado del cliente y enviarlo de nuevo al servidor - esto sería un problema de seguridad) .

La única solución son las devoluciones de llamada. Esto es: la creación de un nuevo objeto de script y señalando el src para el lado frontal JavaScript, que es una respuesta con los valores JSON (myFunction ({datos}), myFunction es una función que hace algo con los datos (por ejemplo, almacenándola en una variable).

Sólo cambia el "application / json" a "text / plain" y no se olvide el JSON.stringify (petición):

var request = {Company: sapws.dbName, UserName: username, Password: userpass};
    console.log(request);
    $.ajax({
        type: "POST",
        url: this.wsUrl + "/Login",
        contentType: "text/plain",
        data: JSON.stringify(request),

        crossDomain: true,
    });

Yo tenía el mismo problema. Mi solución fue añadir cabeceras a mi script PHP que están presentes sólo cuando en el entorno de desarrollo.

Esto permite que las solicitudes de varios dominios:

header("Access-Control-Allow-Origin: *");

Esto le dice a la solicitud de verificación previa que está bien para que el cliente envíe cualquier encabezado que quiere:

header("Access-Control-Allow-Headers: *");

De esta manera no hay necesidad de modificar la solicitud.

Si tiene datos sensibles en su base de datos dev que potencialmente podrían ser filtrado, entonces se podría pensar dos veces antes de esto.

es el aspecto de Firefox y Opera (probado en Mac también) no les gusta el domainness transversal de este (pero Safari está muy bien con ella).

Es posible que tenga que llamar a un código del lado del servidor local para rizar la página remoto.

En mi caso, el problema no estaba relacionado con CORS desde que estaba emitiendo un POST jQuery para el mismo servidor web. Los datos fueron JSON pero había omitido el tipo de datos: parámetro 'json'.

no tenía (ni tampoco añado) un parámetro contentType como se muestra en respuesta David Lopes anteriormente.

yo era capaz de solucionar con la ayuda de los siguientes encabezados

Access-Control-Allow-Origin
Access-Control-Allow-Headers
Access-Control-Allow-Credentials
Access-Control-Allow-Methods

Si usted está en nodejs, aquí está el código se puede copiar / pegar.

app.use((req, res, next) => {
  res.header('Access-Control-Allow-Origin','*');
  res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');
  res.header('Access-Control-Allow-Credentials', true);
  res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, PATCH');
  next();
});
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top