โดยปกติแล้วใน php รวมถึง server-sided script เช่น jsp, asp หรือภาษาอื่น ๆ จะมีการกำหนดค่าของเพจที่ส่งกลับมาว่ามีชนิดเป็น html ซึ่งมีชนิดของไฟล์ที่เราเรียกว่า MIME Type ว่าเป็น text/html
MIME ย่อมาจาก Multipurpose Internet Mail Extension ใช้สำหรับบ่งบอกชนิดของไฟล์สำหรับการรับส่งกันใน Internet เช่น ไฟล์ .txt ธรรมดา จะมี MIME type เป็น “text/plain” ส่วนไฟล์ html ก็จะเป็น “text/html” ส่วนภาพ gif ก็จะเป็น “image/gif” เป็นต้น
ทำไมเราต้องสนใจชนิดของไฟล์พวกนี้ด้วยล่ะ ด้วยเหตุผลที่ว่า สคริปที่เป็น server-sided script อย่างที่ผมอ้างถึงข้างต้น มันสามารถเปลี่ยนชนิดของไฟล์ที่ส่งกลับมาได้น่ะสิครับ เช่น หน้า php ที่ส่งเป็นภาพกลับมาแทนที่จะเป็น html ก็เพราะว่าเค้ามีการส่ง MIME Type ของภาพกลับมาใน header ด้วยครับ
อย่างที่ผมได้บอกตั้งแต่แรกแล้วว่าปกติแล้ว server-sided script โดยปกติแล้วจะส่ง type เป็น html กลับมาให้ แต่ตัว JSON เองนั้น อย่างที่รู้กันอยู่ว่ามันคือ JavaScript (สังเกตจากชื่อย่อก็ได้ครับ JavaScript Object Notation) จะมากำหนดให้เป็น html ก็กระไรอยู่ การใช้งาน JSON จึงควรกำหนด MIME Type ให้มันอย่างถูกต้องไปเลยครับ
เราสามารถกำหนด MIME Type ให้กับ JSON ได้ 2 ชนิด คือ “text/javascript” หรือ “application/json” ครับ ซึ่งแบบหลังจะเป็นที่นิยมมากกว่า
สำหรับคนที่เคยมีประสบการณ์กับ JSON บน jQuery นั้น ถ้าไม่เคยกำหนด MIME Type ให้กับ JSON โดยปล่อยให้มันเป็น “text/html” ธรรมดากลับมา คงจะเคยเจอเหตุการณ์ที่ jQuery สามารถดึงค่า JSON มาใช้ได้บ้างไม่ได้บ้างแหละครับ
และในเมื่อมันเป็นความไม่แน่นอนที่ไม่มีใครอยากให้เกิดขึ้่น เราก็แค่เพิ่ม code เข้าไปเพื่อให้มันกลายเป็น JSON จริง ๆ น่าจะง่ายกว่า
คำสั่งใน php ก็ง่ายแสนง่ายครับ แค่บรรทัดเดียวว่า…
header("content-type:application/json");
เท่านี้เองครับ สิ่งที่ return กลับไปให้บราวเซอร์ก็จะกลายเป็น JSON ในบัดดล ว่าแล้วก็ไปดู LIVE DEMO กันเลย
ล.ป. (ลืมไป) ตัวอย่างใน LIVE DEMO บางทีอาจจะได้ค่ากลับมาเป็น JSON เสมอก็ได้ อย่างที่บอกแหละครับ ว่ามันไม่แน่ไม่นอน
หมายเหตุ
server-sided script หมายถึง script ต่าง ๆ ที่มีการรันที่ server แล้วส่งกลับมาให้กับ client เช่น php, asp, jsp, perl เป็นต้น
client-sided script หมายถึง script ต่าง ๆ ที่มีการรันที่ตัว client เอง เช่น Javascript, VBScript เป็นต้น
เคยใช้ application/json แล้วมีปัญหากับ ie6 ครับ กลายเป็นการ download ไฟล์แทน
เรียกตรง ๆ หรือเปล่าล่ะครับ ถ้าเรียกตรง ๆ ก็เป็นการดาวน์โหลดแน่ ๆ ครับ ถึงใช้ text/javascript ถ้าเรียกตรง ๆ ก็ดาวน์โหลดครับ แต่ถ้าเรียกผ่าน Ajax ก็จะไม่เป็นครับ
เรียกผ่าน ajax ของ jquery ครับ
แล้วถ้าเป็น text/javascript ล่ะครับ
เสียดายจริง ๆ ผมไม่มี IE6 ด้วย
ผมลอง IE6 Portable version แล้วครับ ยังใช้งาน application/json ได้ดีอยู่ครับ ไม่เกิดการดาวน์โหลดอะไรครับ
ตะกี้เพิ่งไปลองมาหยกๆ เลยครับ ใช้ได้ปกติ
ไม่แน่ใจว่าว่าตอนนั้นเกิดจากอะไร
อาจจะเป้นเพราะตอนนั้นผมเพิ่ง install ie6 ใหม่ๆ มั๊งครับ
ครับ เป็นว่าใช้ได้แล้ว ก็ยินดีด้วยครับ
แปลกแฮะ
ใช้ Server IIS
ส่งกลับเปง json ไม่ได้อะ
มันเป็น undefined
แต่ถ้าส่งมาแบบ html ได้นะ
พอเป็น json กลับไมได้
แต่บน Apache ทำได้
ทั้งๆ ที่กำหนด header แล้วนะ
ไม่เคยใช้แฮะ iis กับ php
ลองอ่านอันนี้ดูครับ เผื่อช่วยได้
http://www.w3.org/International/O-HTTP-charset