輸出 JSON 資料時的 Content-Type

haoyq發表於2019-05-10

導語

緣由是這樣的,給前端返回 json 資料,反饋說資料不對(前端是在原始碼基礎上覆制修改的,去掉 jsonp)。看了下後端程式碼,發現是兩次返回 json 的程式碼不同。但這不是問題的原因,然後再一看 JS 程式碼,是前端沒有進行轉換。也正好藉此機會,看了下平時沒有注意到的點。

分析

日常寫程式碼,返回一些簡短資料的時候,沒有使用框架封裝的方法,如下

exit(json_encode([`message` => `test`]));

這時候響應頭的 Content-Typetext/html

如果用框架(ThinkPHP 3.0)的返回方式,

$this->ajaxReturn([`message` => `test`]);

這時候響應頭的 Content-Typetext/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-Typetext/html; charset=utf-8,這時用 typeof 函式列印返回值,是 object 型別,這也是之前程式碼沒有問題的原因。或者使用 JSON.parse() 轉換一下返回值,也是可以的。當然最穩妥的方案還是後端設定 Content-Typeapplication/json


參考資料:Content-Type

相關文章