Domanda

<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>

che fa una richiesta OPTIONS per tale URL, e poi il callback non viene mai chiamato con qualsiasi cosa.

Quando non è di dominio croce, funziona benissimo.

Non dovrebbe jQuery solo effettuare la chiamata con un nodo <script> e poi fare il callback quando il suo carico? Capisco che non sarò in grado di ottenere il risultato (dal momento che è di dominio croce), ma va bene così; Voglio solo la chiamata di passare attraverso. Questo è un bug, o sto facendo qualcosa di sbagliato?

È stato utile?

Altri suggerimenti

MDN ,

  

richieste preflight

     

A differenza di semplici richieste (di cui sopra), "preflight" richieste prima   inviare una richiesta di intestazione OPZIONI HTTP per la risorsa, dall'altro   dominio, al fine di determinare se la richiesta effettiva è sicuro   Spedire. le richieste cross-site sono preflight così da quando essi possono   avere implicazioni per i dati degli utenti. In particolare, la richiesta è   preflight se:

     
      
  • Utilizza metodi diversi da GET o POST. Inoltre, se si utilizza POST per inviare   richiesta dati con un Content-Type diverso   application / x-www-form-urlencoded, form-data multipart / o testo / plain,   per esempio. se la richiesta POST invia un payload XML al server utilizzando   application / xml o text / xml, allora la richiesta viene preflight.
  •   
  • Imposta intestazioni personalizzate nella richiesta (ad esempio, la richiesta utilizza un colpo di testa, come   X-PINGOTHER)
  •   

Se stai cercando di POST

Assicurati di JSON.stringify i dati del modulo e inviarlo come 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"
    });
}

Non credo jQuery sarà solo naturalmente fare una richiesta JSONP quando somministrato un URL simile. Essa, tuttavia, fare una richiesta JSONP quando gli si dice quale argomento da usare per una richiamata:

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

E 'del tutto fino allo script di ricezione di fare uso di tale argomento (che non deve essere chiamato "jsoncallback"), quindi in questo caso non sarà mai chiamata la funzione. Ma, dal momento che lei ha dichiarato che si desidera solo lo script a metaward.com da eseguire, che renderebbe.

In realtà, AJAX cross-domain (XMLHTTP) le richieste non sono ammessi per motivi di sicurezza (si pensi scaricare una pagina web "limitato" dal lato client e inviandola al server - questo sarebbe un problema di sicurezza) .

L'unica soluzione sono le richiamate. Si tratta di: creare un nuovo oggetto di script e indicando lo src fino alla fine JavaScript lato, che è un callback con i valori JSON (myFunction ({dati}), myFunction è una funzione che fa qualcosa con i dati (ad esempio, riporlo in una variabile).

Basta cambiare il "application / json" a "text / plain" e non dimenticate la JSON.stringify (richiesta):

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

Ho avuto lo stesso problema. La mia difficoltà è stato quello di aggiungere intestazioni al mio script PHP che sono presenti solo quando in un ambiente dev.

In questo modo le richieste cross-domain:

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

Questo dice la richiesta di verifica preliminare che è OK per il client di inviare tutte le intestazioni che vuole:

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

In questo modo non v'è alcuna necessità di modificare la richiesta.

Se si dispone di dati sensibili nel database dev che potrebbero potenzialmente essere trapelato, allora si potrebbe pensare due volte prima di questo.

E 'bello come Firefox e Opera (testato su Mac pure) non piace il domainness croce di questo (ma Safari è bene con esso).

Potrebbe essere necessario chiamare un codice lato server locale per arricciare pagina remota.

Nel mio caso, la questione era estraneo a CORS da quando sono stato l'emissione di un jQuery POST allo stesso server web. I dati erano JSON ma avevo omesso il tipo di dati: parametro 'json'.

non ho avuto (né mi aggiungo) un parametro contentType come indicato in David Lopes' risposta di cui sopra.

Sono stato in grado di risolvere il problema con l'aiuto di seguenti intestazioni

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

Se siete su Nodejs, qui è il codice è possibile copiare / incollare.

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();
});
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top