2013-07-23 464 views
2

我在写我自己的MVC框架来练习,我有一个请求类。我想要捕捉请求的类型并相应地解析数据,无论它是AJAX/JSON调用还是HTML/XML请求。检测Ajax请求

进出口目前使用:

$_SERVER['HTTP_ACCEPT'] 

和上面所用的var_dump当它返回应用/ JSON此:

$.ajax({ 
    type: 'post', 
    url: 'index', 
    dataType: 'json', 
    data: { 
     _method: 'put' 
    } 
}); 

的var_dump($ _ SERVER [ 'HTTP_ACCEPT'])退货:

string(46) "application/json, text/javascript, */*; q=0.01" 

问: 是这种方法可靠吗?它总是工作吗?检测此类AJAX调用是否存在安全问题?

注意,在我的框架我所有的Ajax调用必须数据类型:“JSON”,除非它像HTMLXML不同的呼叫类型。

+0

你真的关心它是否是一个Ajax请求,或者只是热点问题研究的要求退货的格式是什么? –

回答

9

使用jQuery,您可以使用$_SERVER['HTTP_X_REQUESTED_WITH']将被设置为“XMLHttpRequest的。”这是使用jQuery时最可靠的方法。

+0

XMLHttpRequest意味着它是一个ajax调用?我如何检测XML或JSON类型? – GGio

+0

@GGio根据您的需求,您可以尝试分析'Accept'头,但我个人会使用查询参数或文件扩展名来表示所需的输出格式。至少对于一个基本的用例。 –

+0

似乎有两个问题:如何检测请求是否来自ajax以及如何找出数据类型。这个答案回答了第一个问题。至于第二个问题,那么可靠性被高估了!请参阅[这个问题](http://stackoverflow.com/questions/477816/what-is-the-correct-json-content-type?rq=1)关于JSON的真实MIME类型和[this one](http ://stackoverflow.com/questions/1049401/how-to-select-content-type-from-http-accept-header-in-php)处理类型检测与Apache比PHP。 –

3

科林·莫雷利回答您的主要问题,但这应该帮助你跟踪窗口。

XMLHttpRequest意味着它的ajax调用?如果 的XML或JSON为 ,我该如何检测其类型

是的。 XMLHttpRequest是发出请求的JavaScript对象。但现在它的命名很差,因为你可以随意发送任何你想要的东西。要回答第二个问题,您必须对收到的有效负载进行一些解析尝试。您可以扫描XML,如果找不到,就假设它是JSON并尝试解析。

+0

为什么我不能使用'$ _SERVER ['HTTP_ACCEPT']'似乎也检测到XML以及它给出'application/xml' – GGio

+0

通常不是一个好主意,只是假设类似的东西设置正确。您应该始终手动测试传入数据以确保它符合您的期望。此外,您可能会遇到某人向您发送无效XML的情况,您应该在执行过多的代码之前尽早发现。 –