ajax - plugin - what is jquery




jQuery $.ajax(), $.post enviando “OPTIONS” como REQUEST_METHOD no Firefox (16)

Corrigi este problema usando uma solução totalmente baseada em Apache. No meu vhost / htaccess eu coloquei o seguinte bloco:

# enable cross domain access control
Header always set Access-Control-Allow-Origin "*"
Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS"

# force apache to return 200 without executing my scripts
RewriteEngine On
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule .* / [R=200,L]

Você pode não precisar da última parte, dependendo do que acontece quando o Apache executa seu script de destino. O crédito vai para o amigável pessoal do ServerFault na última parte.

Tendo problemas com o que eu pensava ser um plugin jQuery relativamente simples ...

O plugin deve buscar dados de um script php via ajax para adicionar opções a um <select> . O pedido do ajax é bem genérico:

$.ajax({
  url: o.url,
  type: 'post',
  contentType: "application/x-www-form-urlencoded",
  data: '{"method":"getStates", "program":"EXPLORE"}',
  success: function (data, status) {
    console.log("Success!!");
    console.log(data);
    console.log(status);
  },
  error: function (xhr, desc, err) {
    console.log(xhr);
    console.log("Desc: " + desc + "\nErr:" + err);
  }
});

Isso parece funcionar bem no Safari. No Firefox 3.5, o REQUEST_TYPE no servidor é sempre 'OPTIONS' e os dados $ _POST não aparecem. O Apache registra a solicitação como tipo 'OPTIONS':

::1 - - [08/Jul/2009:11:43:27 -0500] "OPTIONS sitecodes.php HTTP/1.1" 200 46

Por que esse ajax chamaria de trabalho no Safari, mas não no Firefox, e como posso corrigi-lo para o Firefox?

Response Headers
Date: Wed, 08 Jul 2009 21:22:17 GMT
Server:Apache/2.0.59 (Unix) PHP/5.2.6 DAV/2
X-Powered-By: PHP/5.2.6
Content-Length  46
Keep-Alive  timeout=15, max=100
Connection  Keep-Alive
Content-Type    text/html

Request Headers
Host    orderform:8888
User-Agent  Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1) Gecko/20090624 Firefox/3.5
Accept  text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language en-us,en;q=0.5
Accept-Encoding gzip,deflate
Accept-Charset  ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive  300
Connection  keep-alive
Origin  http://ux.inetu.act.org
Access-Control-Request-Method   POST
Access-Control-Request-Headers  x-requested-with

Aqui está uma foto da saída do Firebug:


Este artigo do centro de desenvolvedores mozilla descreve vários cenários de solicitação entre domínios. O artigo parece indicar que uma solicitação POST com o tipo de conteúdo 'application / x-www-form-urlencoded' deve ser enviada como uma 'solicitação simples' (sem solicitação OPTIONS de 'comprovação'). Descobri, no entanto, que o Firefox enviou a solicitação OPTIONS, mesmo que meu POST tenha sido enviado com esse tipo de conteúdo.

Consegui fazer isso funcionar criando um manipulador de solicitações de opções no servidor, que definiu o cabeçalho de resposta 'Access-Control-Allow-Origin' para '*'. Você pode ser mais restritivo configurando-o para algo específico, como " http://someurl.com ". Além disso, eu li que, supostamente, você pode especificar uma lista separada por vírgulas de várias origens, mas não consegui fazer isso funcionar.

Depois que o Firefox recebe a resposta à solicitação OPTIONS com um valor aceitável 'Access-Control-Allow-Origin', ele envia a solicitação POST.


Eu estava olhando através da fonte 1.3.2, quando usando JSONP, a solicitação é feita através da construção de um elemento SCRIPT dinamicamente, que passa os navegadores Política de mesmo domínio. Naturalmente, você não pode fazer uma solicitação POST usando um elemento SCRIPT, o navegador buscaria o resultado usando GET.

Como você está solicitando uma chamada JSONP, o elemento SCRIPT não é gerado, porque só faz isso quando a chamada Tipo de AJAX está definida como GET.

http://dev.jquery.com/ticket/4690


Eu já tenho esse código manipulando bem minha situação de cors no php:

header( 'Access-Control-Allow-Origin: '.CMSConfig::ALLOW_DOMAIN );
header( 'Access-Control-Allow-Headers: '.CMSConfig::ALLOW_DOMAIN );
header( 'Access-Control-Allow-Credentials: true' );

E estava funcionando bem local e remotamente, mas não para uploads remotos.

Algo acontece com apache / php OU meu código, não me preocupei em pesquisar, quando você solicita OPTIONS ele retorna meu cabeçalho com regras de cors mas com 302 resultado. Portanto, meu navegador não reconhece como uma situação aceitável.

O que eu fiz, baseado na resposta do @Mark McDonald, é só colocar esse código depois do meu cabeçalho:

if( $_SERVER['REQUEST_METHOD'] === 'OPTIONS' )
{
    header("HTTP/1.1 202 Accepted");
    exit;
}

Agora, ao solicitar OPTIONS ele apenas enviará o cabeçalho e o resultado.


Eu tive o mesmo problema com o envio de pedidos para o google maps, e a solução é bastante simples com jQuery 1.5 - para dataType use dataType: "jsonp"


Eu tive um problema semelhante ao tentar usar a API do Facebook.

O único contentType que não enviou o pedido Preflighted parecia ser apenas text / plain ... não o resto dos parâmetros mencionados no mozilla here

  • Por que este é o único navegador que faz isso?
  • Por que o Facebook não conhece e aceita a solicitação de comprovação?

FYI: O documentado Moz Moz sugere que os cabeçalhos X-Lori devem acionar um pedido Preflighted ... isso não acontece.


Eu usei um URL de proxy para resolver um problema semelhante quando quero postar dados no meu apache solr hospedado em outro servidor. (Esta pode não ser a resposta perfeita, mas resolve o meu problema.)

Siga este URL: Usando Mode-Rewrite para proxy , eu adiciono esta linha ao meu httpd.conf:

 RewriteRule ^solr/(.*)$ http://ip:8983/solr$1 [P]

Portanto, posso apenas postar dados em / solr em vez de postar dados em http://ip:8983/solr/ *. Em seguida, será postar dados na mesma origem.


Nós tivemos um problema como este com o ASP.Net. Nosso IIS estava retornando um erro interno do servidor ao tentar executar um jQuery $.post para obter algum conteúdo html devido a PageHandlerFactory foi restrito para responder apenas GET,HEAD,POST,DEBUG verbos GET,HEAD,POST,DEBUG . Assim, você pode alterar essa restrição adicionando o verbo "OPTIONS" à lista ou selecionando "Todos os verbos"

Você pode modificar isso no Gerenciador do IIS, selecionando seu site e, em seguida, selecionando Mapeamentos do Manipulador, clique duas vezes em sua PageHandlerFactory para arquivos * .apx conforme necessário (Usamos o pool de aplicativos integrado com a estrutura 4.0). Clique em Restrições de Solicitação, depois vá para Verbs Tabn e aplique sua modificação.

Agora nossa solicitação $.post está funcionando como esperado :)


O motivo do erro é a mesma política de origem. Permite apenas que você faça XMLHTTPRequests em seu próprio domínio. Veja se você pode usar um retorno de chamada JSONP vez disso:

$.getJSON( 'http://<url>/api.php?callback=?', function ( data ) { alert ( data ); } );

Outra possibilidade de contornar o problema é usar um script de proxy. Esse método é descrito por exemplo aqui


Por favor, esteja avisado:

O JSONP suporta apenas o método de solicitação GET.

* Enviar pedido pelo firefox : *

$.ajax({
   type: 'POST',//<<===
   contentType: 'application/json',
   url: url,
   dataType: "json"//<<=============
    ...
});

Acima do pedido enviado por OPTIONS (enquanto ==> type: 'POST' ) !!!!

$.ajax({
    type: 'POST',//<<===
    contentType: 'application/json',
    url: url,
    dataType: "jsonp"//<<==============
    ...
});

Mas acima do pedido enviado por GET (enquanto ==> tipo: 'POST' ) !!!!

Quando você estiver em "comunicação entre domínios", preste atenção e tenha cuidado.


Solução para isso é:

  1. use dataType: json
  2. add &callback=? para o seu URL

isso funcionou em chamar a API do Facebook e com o Firefox. O Firebug está usando GET vez de OPTIONS com as condições acima (ambas).


Tente adicionar o seguinte:

dataType: "json",
ContentType: "application/json",
data: JSON.stringify({"method":"getStates", "program":"EXPLORE"}),  

Verifique se o URL de action do seu formulário inclui a parte www do domínio, enquanto a página original que você abriu é visualizada sem www .

Geralmente feito para URLs canônicos.

Eu lutei por horas antes de me deparar com este artigo e encontrei a dica de Cross Domain.


Você precisa fazer algum trabalho no lado do servidor. Vejo que você está usando PHP no lado do servidor, mas a solução para o aplicativo da web .NET está aqui: Não é possível definir o tipo de conteúdo para 'application / json' em jQuery.ajax

Faça o mesmo no script PHP e funcionará. Simplesmente: No primeiro pedido, o navegador está perguntando ao servidor se é permitido enviar tais dados com tal tipo e o segundo pedido é o adequado / permitido.


 function test_success(page,name,id,divname,str)
{ 
 var dropdownIndex = document.getElementById(name).selectedIndex;
 var dropdownValue = document.getElementById(name)[dropdownIndex].value;
 var params='&'+id+'='+dropdownValue+'&'+str;
 //makerequest_sp(url, params, divid1);

 $.ajax({
    url: page,
    type: "post",
    data: params,
    // callback handler that will be called on success
    success: function(response, textStatus, jqXHR){
        // log a message to the console
        document.getElementById(divname).innerHTML = response;

        var retname = 'n_district';
        var dropdownIndex = document.getElementById(retname).selectedIndex;
        var dropdownValue = document.getElementById(retname)[dropdownIndex].value;
        if(dropdownValue >0)
        {
            //alert(dropdownValue);
            document.getElementById('inputname').value = dropdownValue;
        }
        else
        {
            document.getElementById('inputname').value = "00";
        }
        return;
        url2=page2; 
        var params2 = parrams2+'&';
        makerequest_sp(url2, params2, divid2);

     }
});         
}




jquery