Detectando Requisições Ajax com PHP
É bem comum trabalharmos com requisições Ajax que batem em um servidor rodando alguma aplicação PHP. O problema é que as vezes utilizamos o mesmo método para atender tanto a arquitetura do seu sistema quanto as requisições que são feitas via Ajax.
Por exemplo: Temos um objeto PHP que tem como objetivo recuperar todas as notícias cadastradas na base de dados.
<?php class MinhaClasse { public function getAllNews(){ // implementação para receber as notícias return $news; } } ?>
Como eu faço para que este mesmo método supra as minhas requisições Ajax sem que eu tenha que criar outro?
É bem comum vermos por aí programadores criando dois objetos diferentes para atender as duas necessidades (aplicação e Ajax). Sendo que a única diferença entre eles é como o método retorna.
Podemos utilizar o mesmo método e fazer com que retorne de forma diferente dependendo de como eu estou chamando o método.
Vamos criar um método chamado isAjax():
public function isAjax(){ return (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest'); }
Funciona de forma simples: Sempre que uma requsição Ajax é disparada um header é setado nesta requisição chamada HTTP_X_REQUESTED_WITH e o valor dela é setado como XMLHttpRequest.
Desta forma a nossa classe ficaria assim:
<?php class MinhaClasse { public function isAjax(){ return (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest'); } public function getAllNews(){ // implementação para receber as notícias // .. // se o metodo for invocado via Ajax, retorne um JSON if($this->isAjax()) { echo json_encode($news); } else { return $news; } } } ?>
Veja que se a requisição for feita via Ajax o método dar um echo JSON de $news. Se o método for invocado de qualquer outra forma ele irá retornar normalmente.
É isso. Post rápido, pá pum 😀
[]’s
Igor.
Não sabia deste recurso, eu uso o método ajax do Jquery. Vou testar se funciona também.
Queria saber de alguma maneira de bloquear o acesso de uma página externa (de fora do meu domínio). Tem como?
Na verdade não é um método 🙂 é só um header que podemos detecta-lo via PHP.
Acho que você precisa ver nos headers do request quem é o referrer para fazer tal bloqueio.
A versão 1 do (objeto) XMLHttpRequest não permitia requisições cross domain, mas a 2 agora permite – com algumas regras de permissionamento. Dê uma olhada 😉
Acho que você não pegou a ideia do post rs.
Legal, geralmente eu envio algo junto para identificar… Vou usar 🙂