Screen Shot 2557-06-03 at 10.08.41 AM
REpresentational State Transfer (REST) นั้นถูกพูดถึงครั้งแรกในปี 2000
โดย Roy Thomas Fielding ชาวอเมริกา
เมื่อมาดูในภาษา Java บ้างเราสามารถสร้าง REST ได้อย่างไร
สิ่งที่พบก็คือ มีวิธีการสร้างได้หลายแบบ ซึ่งไม่เป็นมาตรฐาน
ดังนั้นในปี 2008 ได้เกิด JSR 311  คือ JAX-RS
มีส่วนการทำงานมาตรฐานสำหรับสร้าง REST service ขึ้นมา
และมี library ที่สร้างตามมาตรฐานดังกล่าว คือ Jersey
ซึ่งได้รับความนิยมมากสำหรับนักพัฒนาภาษา Java
ดังนั้นมาทำความรู้จักกับ Jersey กันว่าคืออะไร และเริ่มพัฒนาได้อย่างไร

พื้นฐานของ REST นั่นคือ

การใช้งาน resource ต่างๆ 
ผ่าน HTTP protocol
ผ่าน URI ที่สื่อสารได้ชัดเจน
ผ่าน HTTP method ที่เหมาะสม เช่น

  • HTTP GET สำหรับการดึงข้อมูล
  • HTTP POST สำหรับการสร้างข้อมูล
  • HTTP PUT สำหรับการแก้ไขข้อมูล
  • HTTP DELETE สำหรับลบข้อมูล

รูปแบบของข้อมูลที่ใช้สื่อสารกันอยู่ในรูปแบบ XML, JSON, Atom และอื่นๆ อีกมากมาย
แต่หนึ่งในรูปแบบที่ได้รับความนิยมคือ JSON

แล้ว JSR 311 และ Jersey คืออะไร

JSR 311 หรือ JAX-RS ( Java API for RESTful Web Service )
โดยที่ทำการกำหนดกลุ่มของ APIs เพื่อสร้าง REST Web Service แบบง่ายๆ

ถ้ามองย้อมกลับไปก่อนที่จะเกิด JSR 311 นี้จะเจอ library หรือ REST framework ต่างๆ มากมาย เช่น
Restlet และ RESTEasy ที่มีรูปแบบการพัฒนาที่ไม่เป็นมาตรฐาน
ดังนั้นจึงสร้าง library ที่อ้างอิงตาม JSR 311 ขึ้นมา ซึ่งตัวนั้นก็คือ Jersey
โดย Jersey ประกอบไปด้วยส่วนการทำงานหลักๆ ดังนี้

  • Core Server มีพวก annotation และ APIs ตามJSR 311
  • Core Client คือ Client APIs ช่วยทำให้เราสามารถติดต่อกับ REST service ได้ง่ายๆ
  • Integration คือส่วนที่ใช้สำหรับ integrate เขากับ framework ต่างๆ เช่น  Spring framework, Guice เป็นต้น

ในบทความนี้ จะเน้นในเรื่อง Core Server นั่นคือการสร้าง RESTful Web service นั่นเอง

มาดูขั้นตอนการสร้างดีกว่า ว่าทำอย่างไร ??

1. เริ่มด้วย Software ที่จำเป้นต้องใช้งานกัน ก็คือ Apache Maven นั่นเอง

2. สร้าง project ของเราด้วย Apache Maven ด้วยคำสั่งดังนี้

ผลการทำงาน
จะสร้าง folder ชื่อว่า first-demo ขึ้นมา โดยใน folder จะมีโครงสร้างดังนี้

Screen Shot 2557-06-02 at 11.31.07 PM
และ RESTful Web Service ที่เราสร้างนี้ จะทำงานอยู่บน Grizzly container
ซึ่งทำให้เราสามารถ run service ที่เราสร้างขึ้นมาได้ทันที
โดยไม่ต้องการ Web server อื่นๆ เลย
ทำให้สามารถพัฒนาระบบงานได้อย่างรวดเร็วขึ้น

3. เมื่อดูจาก code ที่ถูกสร้างขึ้นมาอย่างอัตโนมัติ พบว่ามี code ที่น่าสนใจอยู่ 2 ไฟล์ก็คือ

3.1 ไฟล์ MyResourceTest.java สำหรับทดสอบ RESTful Web Service ที่เราจะสร้างขึ้นมา
โดยในการทดสอบนั้น ต้องการสร้าง  URI /resource เมื่อเรียกใช้งานผ่าน HTTP GET
จะต้องส่งผลลัพธ์  Got it! กลับมา
ซึ่งมี code ดังนี้

3.2 ไฟล์ MyResource.java คือไฟล์สำหรับการสร้าง resource หรือ URI ของ service ที่เราต้องการ
ในการพัฒนาจะใช้ annotation ต่างๆ ของ Core server ดังนี้

  • @PATH(“your path”) คือ path ของ resource ที่ต้องการ โดยชื่อของ path จะต่อจาก url หลักของ server เรานั่นเอง เช่น localhost:8080/myresource
  • @GET รองรับ request ที่มาจาก HTTP GET เท่านั้น
  • @Produces( MediaType.TEXT_PLAIN ) คือการกำหนด MIME type หรือรูปแบบข้อมูลที่จะส่งกลับไปผู้ส่ง request โดยจากตัวอย่างจะส่ง text กลับไป นั่นเอง

4. เมื่อทุกอย่างเรียบร้อย ให้ทำการทดสอบว่าทำงานได้ไหมด้วยคำสั่ง
$mvn clean test

ผลการทำงาน
Screen Shot 2557-06-02 at 11.59.26 PM

5. เมื่อทดสอบผ่านเรียบร้อย เราสามารถสั่งให้ Start RESTful Web Service ขึ้นมาได้ ด้วยคำสั่ง
$mvn exec:java

ผลการทำงาน
Screen Shot 2557-06-03 at 12.04.25 AM

จะทำการ start server ด้วย port 8080 และสามารถเข้าใช้งานผ่าน browser ได้ดังรูป

Screen Shot 2557-06-03 at 12.03.25 AM

มาถึงตรงนี้ก็พอเห็นว่า การเริ่มต้นสร้าง RESTful Web Service ด้วย Jersey นั้นก็ไม่ยากอะไรมากนัก
แต่อย่าเอาไปเปรียบเทียบกับภาษาอื่นนะครับ เพราะมันไม่สามารถเปรียบเทียบได้เลย

ต่อมา ผมทำการตั้งโจทย์ว่า ถ้าเราต้องการสร้าง service มีรูปแบบดังนี้ จะทำอย่างไร ?

  • มี URI /person
  • รองรับ request ที่ส่งมาผ่าน HTTP GET เท่านั้น
  • ทำการส่งข้อมูลรูปแบบ JSON ซึ่งเป็นรายละเอียดของ person ประกอบไปด้วย id และ name

เริ่มด้วยทำการเพิ่มสิ่งที่ต้องการเข้าไปใน pom.xml ก่อน นั่นก็คือ library ที่เราต้องการ คือ jersey

ต่อจากนั้นเขียน test ก่อนว่า เราต้องการอะไร ดังนี้

ผลจากการทดสอบจะทำงานผิดพลาด
เนื่องจากยังไม่ทำการ implment service เลย ดังรูป

Screen Shot 2557-06-03 at 1.13.17 AM

ดังนั้น จึงทำการสร้างไฟล์ Person.java ขึ้นมา เพื่อทำการสร้าง resource ของ service ที่ต้องการดังนี้

ทำการทดสอบอีกครั้ง จะผ่าน ซึ่งมีผลการทำงานดังรูป

Screen Shot 2557-06-03 at 1.15.58 AM

ถ้าไม่เชื่อในสิ่งที่ทดสอบก็ลองเข้าไปดูผลผ่าน browser ได้ผลดังนี้

Screen Shot 2557-06-03 at 1.17.05 AM

มาถึงตรงนี้ เราก็สามารถสร้าง RESTful Web Service ตามแบบที่เราต้องการได้
โดยเริ่มจากการเขียน Test ก่อน เพื่อระบุขอบเขตของปัญหาว่า
ต้องการจะแก้ไขปัญหาอะไร แล้วจึงลงมือ coding เพื่อทำให้ Test นั้นผ่าน
ซึ่งเป็นการพัฒนาตามแนวคิดของ Test Driven Development
แต่ก็ยังไม่ครบขั้นตอนการทำงาน เนื่องจากเรายังขาดการ Refactoring  code นะครับ
แต่ไม่เป็นไร เนื่องจากตอนนี้เราสนใจวิธีการสร้าง RESTful Web Service ด้วย Jersey เท่านั้น

สามารถดูตัวอย่าง code ได้ที่นี่ Github :: Up1 Demo Jersey