<div class="toc-wraper ui card column author-box grid pt-2" style="display:none">
<a href="javascript:void(0);" class="close-toc pull-right" style="width: 20px;position: absolute;right: 7px;top: 3px;margin-bottom: 20px;">
<i class="icon remove text-mute "></i>
</a>
<div id="toc" class="tocify">
<ul id="tocify-header0" class="tocify-header nav nav-list"><li class="tocify-item active" data-unique="5dc99f"><a>問題</a></li></ul><ul id="tocify-header1" class="tocify-header nav nav-list"><li class="tocify-item" data-unique="29f56d"><a>方法一、ajax () 函數</a></li><ul class="tocify-subheader nav nav-list" data-tag="3"><li class="tocify-item" data-unique="165dcc"><a>直接訪問的話:</a></li><li class="tocify-item" data-unique="43ddcd"><a>使用 Ajax 訪問:</a></li></ul></ul><ul id="tocify-header2" class="tocify-header nav nav-list"><li class="tocify-item" data-unique="f8ed16"><a>方法二、expectsJson ()</a></li></ul></div></div><div name="5dc99f" data-unique="5dc99f"></div><h2 id="5dc99f">問題<a href="#5dc99f" class="anchorific" style="display: none;">#</a></h2>
如何判斷請求是來自 Ajax 或者是正常的 URL 訪問?
方法一、ajax()
函數
routes/web.php
. . . Route::get('test-ajax', function () {
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">request</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">ajax</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token single-quoted-string string">'來自 AJAX 請求'</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token single-quoted-string string">'正常訪問'</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>
});
直接訪問的話:#
使用 Ajax 訪問:
此刻打開 Chrome 控制台,貼入以下內容:
$.get("http://homestead.test/test-ajax", function(data) {
console.log(data);
});
注意:記得把
homestead.test
換為你自己的域名。
方法二、expectsJson()
Route::get('test-ajax', function () {
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">request</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">expectsJson</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token single-quoted-string string">'來自 AJAX 請求'</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token single-quoted-string string">'正常訪問'</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>
});
expectsJson()
使用方法與 ajax()
相近,不過查看源代碼后還是能看到區別:
// 判斷客戶端是否期待返回 JSON 數據 public function expectsJson() { return ($this->ajax() && ! $this->pjax()) || $this->wantsJson(); }
// 判斷客戶端是否「請求返回 JSON 格式」的數據
public function wantsJson()
{
$acceptable = $this->getAcceptableContentTypes();<span class="token keyword">return</span> <span class="token keyword">isset</span><span class="token punctuation">(</span><span class="token variable">$acceptable</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">&&</span> <span class="token scope">Str<span class="token punctuation">::</span></span><span class="token function">contains</span><span class="token punctuation">(</span><span class="token variable">$acceptable</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token single-quoted-string string">'/json'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'+json'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
}
// 判斷客服端是否使用 Pjax
public function pjax()
{
return $this->headers->get('X-PJAX') == true;
}// 判斷是否 Ajax 請求
public function ajax()
{
return $this->isXmlHttpRequest();
}
// 判斷 Header 信息里
X-Requested-With
存在,並等於XMLHttpRequest
public function isXmlHttpRequest()
{
return 'XMLHttpRequest' == $this->headers->get('X-Requested-With');
}
需要注意的是
ajax()
是判斷X-Requested-With
標頭,而wantsJson()
是判斷Accept
標頭里是否存在json
,而expectsJson()
是兩種情況去除掉 Pjax 請求。