[Java] REST รู้จัก consumes, produces และทำให้ method รองรับหลาย mediatype
อีกเรื่องสำหรับการเขียน REST web services แต่ครั้งนี้ เราจะว่ากันด้วยลูกเล่นต่างๆ ที่เราสามารถประยุกต์ใช้เพิ่มเติม
เจ้าตัวเหลือง เปรียบเสมือน web service ของเรา @Consumes และ @Produces เป็นการกำหนด MediaType ให้กับ method web service แต่ละตัว โดยทั้ง 2 ตัวนี้มีข้อแตกต่างคือทิศทางการเรียกใช้งาน คือ @Consumes ใช้สำหรับ request และ @Produces ใช้สำหรับ response
ตัวอย่างที่ผ่านมาหลายตัวเรามักจะเห็น MediaType มีแค่ชนิดเดียว แต่ในความจริงแล้วเราสามารถเปิดให้กำหนดหลายตัวได้โดยกำหนดในลักษณะ array ตัวอย่างนี้ก็รองรับ XML และ JSON ขึ้นอยู่กับการเรียกใช้งานจาก client
Request Header ที่เราจะต้องกำหนดเพื่อให้เข้ากับฝั่ง server ยิ่งถ้าเราเปิดช่องให้รองรับ MediaType หลายชนิดแล้ว ยิ่งมีความสำคัญในการเรียกใช้งาน รวมถึงผลลัพธ์ตรงตามที่ต้องการด้วย ซึ่ง header ที่สำคัญ คือ
Content-Type จะสัมพันธ์กับ @Consumes ซึ่งใช้กับ request
415 : Unsupported Media Type
Accept จะสัมพันธ์กับ @Produces ซึ่งใช้กับ response
406 : Not Acceptable
Client Error ที่เกิดขึ้นนี้เกิดจากการใช้งานไม่ตรงกันกับการเขียนไว้ที่ฝั่ง server ส่งผลให้เรียกใช้งานไม่ได้
Request/Response Body หรือก็คือส่วนของข้อมูล (data) ที่เราต้องการรับ-ส่ง โดยมีตัวอย่างทั้ง XML และ JSON ให้ดูกันครับ โดยแปลงจาก Object ของ Appdata ด้านบน
MediaType : application/xml
Tools สำหรับทดสอบ REST โดยที่เราไม่ต้องเขียนโปรแกรมฝั่ง client ขึ้นมาเรียกใช้งาน ผมเคยใช้อยู่ 3 ตัว ความสามารถแตกต่างกันไปนิดหน่อยเลยขอแปะมาด้วยเผื่อเป็นตัวเลือกครับ
เจ้าตัวเหลือง เปรียบเสมือน web service ของเรา @Consumes และ @Produces เป็นการกำหนด MediaType ให้กับ method web service แต่ละตัว โดยทั้ง 2 ตัวนี้มีข้อแตกต่างคือทิศทางการเรียกใช้งาน คือ @Consumes ใช้สำหรับ request และ @Produces ใช้สำหรับ response
@POST @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Appdata create(Appdata entity) { System.out.println("POST:"+entity); return entity; }
@XmlRootElement public class Appdata { private Integer orderId; private String orderDate; private List- items; /* (setter/getter) */ }
ตัวอย่างที่ผ่านมาหลายตัวเรามักจะเห็น MediaType มีแค่ชนิดเดียว แต่ในความจริงแล้วเราสามารถเปิดให้กำหนดหลายตัวได้โดยกำหนดในลักษณะ array ตัวอย่างนี้ก็รองรับ XML และ JSON ขึ้นอยู่กับการเรียกใช้งานจาก client
Request Header ที่เราจะต้องกำหนดเพื่อให้เข้ากับฝั่ง server ยิ่งถ้าเราเปิดช่องให้รองรับ MediaType หลายชนิดแล้ว ยิ่งมีความสำคัญในการเรียกใช้งาน รวมถึงผลลัพธ์ตรงตามที่ต้องการด้วย ซึ่ง header ที่สำคัญ คือ
Content-Type จะสัมพันธ์กับ @Consumes ซึ่งใช้กับ request
415 : Unsupported Media Type
406 : Not Acceptable
Client Error ที่เกิดขึ้นนี้เกิดจากการใช้งานไม่ตรงกันกับการเขียนไว้ที่ฝั่ง server ส่งผลให้เรียกใช้งานไม่ได้
Request/Response Body หรือก็คือส่วนของข้อมูล (data) ที่เราต้องการรับ-ส่ง โดยมีตัวอย่างทั้ง XML และ JSON ให้ดูกันครับ โดยแปลงจาก Object ของ Appdata ด้านบน
MediaType : application/xml
<appdata> <items> <itemid>1</itemid> <itemname>My Item</itemname> </items> <orderdate>12/02/2559</orderdate> <orderid>33</orderid> </appdata>MediaType : application/json
{ "items": [ { "itemId": 1, "itemName": "My Item" } ], "orderDate": "12/02/2559", "orderId": 33 }
Tools สำหรับทดสอบ REST โดยที่เราไม่ต้องเขียนโปรแกรมฝั่ง client ขึ้นมาเรียกใช้งาน ผมเคยใช้อยู่ 3 ตัว ความสามารถแตกต่างกันไปนิดหน่อยเลยขอแปะมาด้วยเผื่อเป็นตัวเลือกครับ
Postman | Advanced REST client | Boomerang - SOAP & REST Client |