Ett problem som uppstår när man utvecklar en webbapplikation som ska vara tillgänglig för alla oavsett om deras webbläsare stödjer JavaScript eller inte är att på servern avgöra vilken typ av anrop det är.
Anledningen till att vi behöver veta om det är ett Ajax anrop eller inte är att det avgör vad vi ska returnera till webbläsaren. Vid ett Ajax anrop vill man oftast returnera JSON och vid ett vanligt anrop är det antigen html eller en Location header som gäller.
I början löste jag detta problem genom att alltid skicka med fältet ajax med värdet true från alla Ajax anrop som jag gjorde. Detta fungerar kanon och är enkelt att kontrollera på servern i get eller post variabeln. Denna lösning är dock helt onödigt då jQuery och de flesta andra JavaScript ramverk redan skickar med information som vi kan använda för att detektera om det är ett Ajax anrop.
Ungefär såhär kan ett typiskt Ajax anrop se ut om man kör print_r($_SERVER) i php, jag har dock plockat bort ett gäng värden för att spara utrymme.
[sourcecode language=”text”]
[HTTP_HOST] => www.wee.se
[HTTP_USER_AGENT] => Mozilla/5.0 (Windows; U; Windows NT 6.1; sv-SE; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8
[HTTP_ACCEPT] => */*
[HTTP_ACCEPT_LANGUAGE] => sv-se,sv;q=0.8,en-us;q=0.5,en;q=0.3
[HTTP_ACCEPT_ENCODING] => gzip,deflate
[HTTP_ACCEPT_CHARSET] => ISO-8859-1,utf-8;q=0.7,*;q=0.7
[HTTP_KEEP_ALIVE] => 115
[HTTP_CONNECTION] => keep-alive
[CONTENT_TYPE] => application/x-www-form-urlencoded
[HTTP_X_REQUESTED_WITH] => XMLHttpRequest
[HTTP_REFERER] => http://www.wee.se/
[/sourcecode]
Det som är värt att lägga märke till här är nyckeln som heter HTTP_X_REQUESTED_WITH som har värdet XMLHttpRequest, det är nämligen denna header med detta värde som jQuery skickar med Ajax anrop för att berätta att det är just ett Ajax anrop.
Nu när vi vet detta är det enkelt att skriva en php funktion som du sedan kan använda för att kolla om det är ett Ajax anrop eller inte.
[sourcecode language=”php”]
function isAjax()
{
return @ $_SERVER[’HTTP_X_REQUESTED_WITH’] === ’XMLHttpRequest’;
}
[/sourcecode]
Jag hoppas att detta enkla tips hjälper någon att skriva lite bättre Ajax applikationer, som vanligt så tar jag gärna emot synpunkter och förslag i kommentarerna.