Pergunta

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

Ele faz uma solicitação de opções para esse URL e, em seguida, o retorno de chamada nunca é chamado com nada.

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

JQuery não deveria apenas fazer a ligação com um <script> Nó e depois faça o retorno de chamada quando estiver carregado? Entendo que não poderei obter o resultado (já que é domínio cruzado), mas tudo bem; Eu só quero que a chamada seja realizada. Isso é um bug, ou estou fazendo algo errado?

Foi útil?

Solução 2

Outras dicas

De acordo com Mdn,

Pedidos pré -apagados

Diferentemente das solicitações simples (discutidas acima), as solicitações "pré -apagadas" primeiro enviam um cabeçalho de solicitação de opções HTTP para o recurso no outro domínio, a fim de determinar se a solicitação real é segura para enviar. As solicitações entre sites são pré-intensificadas como essa, pois podem ter implicações nos dados do usuário. Em particular, uma solicitação é previsto se:

  • Ele usa métodos diferentes de obter ou postar. Além disso, se a postagem for usada para enviar dados de solicitação com um tipo de conteúdo que não seja o aplicativo/x-www-forma-urlcoded, multipart/form-dados ou texto/plano, por exemplo, se a solicitação de postagem enviar uma carga de pagamento XML para o servidor Usando o aplicativo/xml ou text/xml, a solicitação é pré -apagada.
  • Ele define cabeçalhos personalizados na solicitação (por exemplo, a solicitação usa um cabeçalho como X-Pingother)

Se você está tentando PUBLICAR

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

Não acredito que o jQuery faça uma solicitação JSONP quando recebe um URL como esse. No entanto, ele fará uma solicitação JSONP quando você disser que argumento usar para um retorno de chamada:

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

Está inteiramente ao script de recebimento usar esse argumento (que não precisa ser chamado de "JSONCALLBACK"); portanto, neste caso, a função nunca será chamada. Mas, como você declarou que deseja que o script no metaward.com seja executado, isso faria isso.

De fato, não são permitidas solicitações de AJAX (XMLHTTP) de domínio cruzado por motivos de segurança (pense em buscar uma página "restrita" do lado do cliente e enviá-lo de volta ao servidor-esse seria um problema de segurança).

A única solução alternativa são retornos de chamada. Isto é: Criando um novo objeto de script e apontando o SRC para o JavaScript do lado final, que é um retorno de chamada com os valores JSON (MyFunction ({Data}), o MyFunction é uma função que faz algo com os dados (por exemplo, armazenando-os em uma variável).

Basta alterar o "Application/JSON" para "Text/Plain" e não esqueça o JSON.Stringify (Solicy):

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

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

Isso permite solicitações de domínio cruzado:

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

Isso diz ao pedido de pré -voo que não há problema para o cliente enviar todos os cabeçalhos que desejar:

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

Dessa forma, não há necessidade de modificar a solicitação.

Se você possui dados confidenciais no seu banco de dados de desenvolvimento que possam ser vazados, poderá pensar duas vezes sobre isso.

Parece o Firefox e a Opera (testados no Mac também) não gostam da domínio cruzada disso (mas o Safari está bem com ele).

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

No meu caso, o problema não estava relacionado ao CORS desde que eu estava emitindo uma postagem jQuery para o mesmo servidor da web. Os dados eram JSON, mas eu havia omitido o tipo de dados: o parâmetro 'json'.

Eu não tinha (nem acrescentei) um parâmetro de contentType, como mostrado na resposta de David Lopes acima.

Consegui consertá -lo com a ajuda dos seguintes cabeçalhos

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

Se você estiver no NodeJS, aqui está o código que você pode copiar/colar.

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top