¿Por qué recibo una solicitud de OPCIONES en lugar de una solicitud GET?

  $.get("http://example.com/", function(data) { alert(data); });  

hace una solicitud de OPCIONES a esa URL, y luego la callback nunca se llama con nada.

Cuando no es dominio cruzado, funciona bien.

¿No debería jQuery realizar la llamada con un nodo y luego hacer la callback cuando está cargada? Entiendo que no podré obtener el resultado (ya que es de dominio cruzado), pero está bien; Solo quiero que termine la llamada. ¿Es esto un error, o estoy haciendo algo mal?

De acuerdo con MDN ,

Solicitudes pre-iluminadas

A diferencia de las solicitudes simples (discutidas anteriormente), las solicitudes “pre-iluminadas” primero envían un encabezado de solicitud HTTP OPTIONS al recurso en el otro dominio, para determinar si la solicitud real es segura de enviar. Las solicitudes entre sitios se preludian de esta manera, ya que pueden tener implicaciones para los datos del usuario. En particular, una solicitud se realiza de antemano si:

  • Utiliza métodos distintos de GET o POST. Además, si se utiliza POST para enviar datos de solicitud con un tipo de contenido distinto de application / x-www-form-urlencoded, multipart / form-data o text / plain, por ejemplo, si la solicitud POST envía una carga XML al servidor usando application / xml o text / xml, entonces la solicitud se realiza de antemano.
  • Establece encabezados personalizados en la solicitud (por ejemplo, la solicitud utiliza un encabezado como X-PINGOTHER)

Si estás tratando de POSTAR

Asegúrese de JSON.stringify los datos de su formulario y enviarlos como text/plain .

 

 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 que jQuery simplemente haga una solicitud JSONP cuando se le presente una URL como esa. Sin embargo, hará una solicitud JSONP cuando le diga qué argumento usar para una callback:

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

Depende totalmente de la secuencia de comandos de recepción utilizar ese argumento (que no tiene que llamarse “jsoncallback”), por lo que en este caso nunca se llamará a la función. Pero, como dijiste que solo querías que se ejecutara el script en metaward.com, eso lo haría.

De hecho, las solicitudes AJAX (XMLHttp) entre dominios no están permitidas por razones de seguridad (piense en buscar una página web “restringida” desde el lado del cliente y enviándola al servidor; esto sería un problema de seguridad).

La única solución son las devoluciones de llamada. Esto es: crear un nuevo objeto de script y apuntar el src al JavaScript del extremo, que es una callback con valores JSON (myFunction ({data}), myFunction es una función que hace algo con los datos (por ejemplo, almacenarlo) en una variable).

Simplemente cambie “application / json” por “text / plain” y no olvide el JSON.stringify (request):

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

Parece que Firefox y Opera (probado en mac también) no les gusta el dominio cruzado de esto (pero Safari está de acuerdo con esto).

Es posible que deba llamar a un código local del lado del servidor para curvar la página remota.

Yo tuve el mismo problema. Mi solución fue agregar encabezados a mi script PHP, que solo están presentes en el entorno de desarrollo.

Esto permite solicitudes entre dominios:

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

Esto le dice a la solicitud de verificación previa que está bien que el cliente envíe los encabezados que quiera:

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

De esta forma no hay necesidad de modificar la solicitud.

Si tiene datos confidenciales en su base de datos de desarrollo que podrían filtrarse, entonces puede pensarlo dos veces.