[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 |
