輸出 JSON 資料時的 Content-Type
導語
緣由是這樣的,給前端返回 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 。