[Java] REST รู้จัก consumes, produces และทำให้ method รองรับหลาย mediatype

อีกเรื่องสำหรับการเขียน REST web services แต่ครั้งนี้ เราจะว่ากันด้วยลูกเล่นต่างๆ ที่เราสามารถประยุกต์ใช้เพิ่มเติม
เจ้าตัวเหลือง เปรียบเสมือน 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

    Accept จะสัมพันธ์กับ @Produces ซึ่งใช้กับ response
    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

Facebook Comment

Popular post of 7 days

[Java] ความแตกต่างระหว่าง Overloading กับ Overriding

ลืมรหัสปลดล็อค Android เข้าเครื่องไม่ได้ มีทางออกครับ

[Android] เปิดเครื่องไม่ได้ โลโก้ค้าง (Boot Loop)