É 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]
<?php
class MinhaClasse {
public function getAllNews(){
// implementação para receber as notícias
return $news;
}
}
?>
[/php]
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():
[php]
public function isAjax(){
return (!empty($_SERVER[‘HTTP_X_REQUESTED_WITH’]) && strtolower($_SERVER[‘HTTP_X_REQUESTED_WITH’]) == ‘xmlhttprequest’);
}
[/php]
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]
<?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;
}
}
}
?>
[/php]
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?
LikeLike
Na verdade não é um método 🙂 é só um header que podemos detecta-lo via PHP.
LikeLike
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 😉
LikeLike
Acho que você não pegou a ideia do post rs.
LikeLike
Legal, geralmente eu envio algo junto para identificar… Vou usar 🙂
LikeLike