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.

Posts Relacionados:

  • Nenhum post relacionado!

7 Comments

  1. Pingback: Tropeçando 38 | Rafael Bernard Araujo

  2. Pingback: Detectando Requisições Ajax com PHP – Criar Site

  3. 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 😉

Leave a Reply

Your email address will not be published. Required fields are marked *