導語
緣由是這樣的,給前端返回 json 資料,反饋說資料不對(前端是在原始碼基礎上覆制修改的,去掉 jsonp)。看了下後端程式碼,發現是兩次返回 json 的程式碼不同。但這不是問題的原因,然後再一看 JS 程式碼,是前端沒有進行轉換。也正好藉此機會,看了下平時沒有注意到的點。
分析
日常寫程式碼,返回一些簡短資料的時候,沒有使用框架封裝的方法,如下
exit(json_encode([`message` => `test`]));
這時候響應頭的 Content-Type 是 text/html
。
如果用框架(ThinkPHP 3.0)的返回方式,
$this->ajaxReturn([`message` => `test`]);
這時候響應頭的 Content-Type 是 text/html; charset=utf-8
。看了原始碼,是有這行程式碼的
header(`Content-Type:text/html; charset=utf-8`);
結論
實際上,json 資料是有特定的 Content-Type,是 application/json
。後來又去看了 Laravel ,返回 json 的時候, Content-Type 就是 application/json
。出現這樣的問題,是因為自己不夠嚴謹,而且使用的框架有些老舊。
補充一下,後來又看了前端的程式碼。實際上用 JQuery 封裝的 ajax 方法,dataType 設定為 jsonp
或者 json
,都可以自動轉換為 json 格式,即使 Content-Type 是 text/html; charset=utf-8
,這時用 typeof
函式列印返回值,是 object 型別,這也是之前程式碼沒有問題的原因。或者使用 JSON.parse()
轉換一下返回值,也是可以的。當然最穩妥的方案還是後端設定 Content-Type 為 application/json
。
參考資料:Content-Type。