Por que estou recebendo uma solicitação OPTIONS em vez de uma solicitação GET?

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

ele faz uma solicitação OPTIONS para essa URL e, em seguida, o retorno de chamada nunca é chamado com nada.

Quando não é um domínio cruzado, funciona bem.

O jQuery não deveria apenas fazer a chamada com um nó e então fazer o retorno de chamada quando ele é carregado? Eu entendo que não será capaz de obter o resultado (já que é um domínio cruzado), mas tudo bem; Eu só quero que a binding seja finalizada. Isso é um bug, ou estou fazendo algo errado?

Segundo o MDN ,

Pedidos preflighted

Ao contrário das solicitações simples (discutidas acima), as solicitações “preflighted” primeiro enviam um header de solicitação HTTP OPTIONS para o recurso no outro domínio, para determinar se a solicitação real é segura para enviar. As solicitações entre sites são pré-formatadas assim, pois podem ter implicações nos dados do usuário. Em particular, uma solicitação é pré-determinada se:

  • Ele usa methods diferentes de GET ou POST. Além disso, se o POST for usado para enviar dados de solicitação com um tipo de conteúdo diferente de application / x-www-form-urlencoded, multipart / form-data ou text / plain, por exemplo, se a solicitação POST enviar uma carga XML ao servidor usando application / xml ou text / xml, a solicitação é preflighted.
  • Ele define headers personalizados na solicitação (por exemplo, a solicitação usa um header como X-PINGOTHER)

Se você está tentando fazer o POST

Certifique-se de JSON.stringify seus dados de formulário e envie 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" }); } 

Eu não acredito que o jQuery irá naturalmente fazer uma requisição JSONP quando receber uma URL como essa. No entanto, ele fará uma solicitação JSONP quando você informar qual argumento usar para um retorno de chamada:

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

Cabe ao script de recepção fazer uso desse argumento (que não precisa ser chamado de “jsoncallback”), portanto, neste caso, a function nunca será chamada. Mas, desde que você declarou que só quer que o script em metaward.com seja executado, isso o faria.

Na verdade, solicitações de AJAX (XMLHttp) entre domínios não são permitidas por motivos de segurança (pense em buscar uma página da Web “restrita” do lado do cliente e enviá-la de volta ao servidor – isso seria um problema de segurança).

A única solução alternativa são retornos de chamada. Isso é: criar um novo object de script e apontar o src para o JavaScript do lado final, que é um retorno de chamada com valores JSON (myFunction ({data}), myFunction é uma function que faz algo com os dados (por exemplo, armazenando em uma variável).

Apenas mude o “application / json” para “text / plain” e não esqueça o 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 o Firefox e o Opera (testados no mac também) não gostam do domínio cruzado disso (mas o Safari está bem com isso).

Pode ser necessário chamar um código do lado do servidor local para enrolar a página remota.

Eu tive o mesmo problema. Minha correção foi adicionar headers ao meu script PHP, que estão presentes apenas no ambiente de desenvolvimento.

Isso permite solicitações entre domínios:

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

Isso informa à solicitação de comprovação de que está tudo bem para o cliente enviar os headers desejados:

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

Desta forma, não há necessidade de modificar o pedido.

Se você tiver dados confidenciais em seu database dev que possam potencialmente vazar, talvez pense duas vezes sobre isso.