jquery - method - ¿Por qué recibo una solicitud de OPCIONES en lugar de una solicitud GET?
request method options angular 2 (9)
<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>
hace una solicitud de OPCIONES a esa URL, y luego la devolución de llamada nunca se llama con nada.
Cuando no es dominio cruzado, funciona bien.
¿No debería jQuery simplemente realizar la llamada con un nodo <script>
y luego realizar la devolución de llamada cuando está cargada? Entiendo que no podré obtener el resultado (ya que es de dominio cruzado), pero está bien; Solo quiero que la llamada pase. ¿Es esto un error, o estoy haciendo algo mal?
De hecho, las solicitudes AJAX (XMLHttp) entre dominios no están permitidas debido a razones de seguridad (piense en obtener una página web "restringida" del lado del cliente y enviarla de vuelta 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 lado del extremo, que es una devolución de llamada con valores JSON (myFunction ({data}), myFunction es una función que hace algo con los datos (por ejemplo, almacenándolo en una variable).
En mi caso, el problema no estaba relacionado con CORS ya que estaba emitiendo un POST de jQuery al mismo servidor web. Los datos eran JSON pero había omitido el parámetro dataType: ''json''.
No tenía (ni añadí) un parámetro contentType como se muestra en la respuesta de David Lopes anterior.
Las OPCIONES son de http://www.w3.org/TR/cors/ Ver http://metajack.im/2010/01/19/crossdomain-ajax-for-xmpp-http-binding-made-easy/ para un poco más de información
No creo que jQuery simplemente realice una solicitud JSONP cuando se le dé una URL como esa. Sin embargo, hará una solicitud JSONP cuando le diga qué argumento usar para una devolución de llamada:
$.get("http://metaward.com/import/http://metaward.com/u/ptarjan?jsoncallback=?", function(data) {
alert(data);
});
Depende completamente del script de recepción hacer uso de ese argumento (que no tiene que llamarse "jsoncallback"), por lo que en este caso nunca se llamará a la función. Pero, como dijo que solo quiere que se ejecute el script en metaward.com, eso lo lograría.
Se parece a Firefox y Opera (también probado en mac) no le gusta el dominio cruzado de esto (pero Safari está bien con eso).
Es posible que tenga que llamar a un código del lado del servidor local para enrollar la página remota.
Según MDN ,
Peticiones
A diferencia de las solicitudes simples (explicadas anteriormente), las solicitudes "preclighted" envían primero un encabezado de solicitud HTTP OPTIONS al recurso en el otro dominio, para determinar si la solicitud real es segura para enviar. Las solicitudes de sitios cruzados se verifican de esta manera, ya que pueden tener implicaciones para los datos del usuario. En particular, una solicitud se marca previamente si:
- Utiliza métodos distintos de GET o POST. Además, si se usa 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 utilizando application / xml o text / xml, entonces la solicitud se verifica previamente.
- Establece encabezados personalizados en la solicitud (por ejemplo, la solicitud utiliza un encabezado como X-PINGOTHER)
Simplemente cambie "application / json" a "text / plain" y no olvide el JSON.stringify (solicitud):
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 tuve el mismo problema. Mi solución fue agregar encabezados a mi script PHP que están presentes solo en el entorno dev.
Esto permite solicitudes de dominio cruzado:
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 desee:
header("Access-Control-Allow-Headers: *");
De esta manera no hay necesidad de modificar la solicitud.
Si tiene datos confidenciales en su base de datos de desarrollo que potencialmente podrían filtrarse, entonces podría pensárselo dos veces.
Si estas tratando de POST
Asegúrese de JSON.stringify
los datos de su formulario y enviarlos 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"
});
}