/ 365วันแห่งโปรแกรม

[365 วันแห่งโปรแกรม #day24] REST

วันที่ยี่สิบสี่ของ ‪#‎365วันแห่งโปรแกรม‬ วันนี้เราจะมีคุยกันเรื่อง REST


ในปัจจุบันแทบทุกโปรแกรมที่เราใช้กันอยู่ ล้วนแต่มีการส่งข้อมูลเข้าออกไปยัง internet ซึ่งวิธีการที่ใช้ส่วนใหนั้นก็คือการเชื่อมต่อกับ Web Service และในวันนี้เราจะมีคุยกันในเรื่องของ REST ซึ่งเป็นสถาปัตยกรรมหนึ่งสำหรับทำ Web Service

REST คืออะไร

REST มาจากคำว่า Representational State Transfer เป็นรูปแบบของการทำ scalable web services ซึ่งถูกออกแบบมาใช้ใช้งานได้ง่าย และไม่ขึ้นอยู่กับแพลตฟอร์มใดแพลตฟอร์มหนึ่ง เพราะ REST นั้นทำงานบน HTTP และใช้ HTTP verbs (GET, POST, PUT, DELETE, etc.) ในการสื่อสารเป็นหลัก

ฟีเจอร์ของ RESTful Services

ทุกระบบหรือโปรแกรมล้วนแต่ต้องใช้งาน resources ไม่ว่าจะเป็นรูปภาพ วิดิโอ เว็บเพจ ข้อมูลต่างๆ หรืออะไรก็แล้วแต่ จุดประสงค์ของการทำ service ก็คือการสร้างช่องทางให้ client สามารถเข้าถึง resource ต่างๆ ได้ RESTful Services ก็เป็นเช่นนั้น โดยทั่วไปแล้ว RESTful Services จะมีลักษณะดังต่อไปนี้

  • Representations RESTful service จะโฟกัสที่ resources และวิธีการส่งมอบ resources ให้ client ที่ต้องการ เราต้องรู้ว่ามี resources อะไรบ้าง จะนำเสนอสิ่งนั้นและส่งมอบอย่างไร ในทุกครั้งที่เราจะสร้างระบบอะไรก็ตาม สิ่งแรกที่ควรทำหรือระบุให้ได้ว่าาเราต้องมี resources อะไรบ้าง แล้วแต่ละอันมันสัมพันธ์กันอย่างไร หลังจากนั้นเราต้องคิดหาวิธีในการ represent resources เหล่านั้น ปกติแล้วไม่มีการกำหนดไว้ว่าต้องใช้ format ไหนในการแสดง resource ดังนั้นจึงขึ้นอยู่กับผู้พัฒนาล้วนๆ

ตัวอย่างของการใช้ JSON เพื่อแสดง object ของคลาส Person

{
	"ID": "1",
	"Name": "M Vaqqas",
	"Email": "m.vaqqas@gmail.com",
	"Country": "India"
}

ตัวอย่างของการใช้ XML เพื่อแสดง object ของคลาส Person

<Person>
	<ID>1</ID>
	<Name>M Vaqqas</Name>
	<Email>m.vaqqas@gmail.com</Email>
	<Country>India</Country>
</Person>
  • Messages client และ service นั้นสื่อการกันด้วย message เมื่อ client ส่ง request ไปหา service service ก็จะประมวลผล message ที่ส่งมา แล้วส่ง response กลับไป โดย message ของ RESTful Service นั้นจะอิงอยู่กับ HTTP 1.1 ดังนั้นเราสามารถสร้าง message ได้ โดยใช้ verb, uri, header และ body

    แต่เดิมนั้นเรามักใช้ http verb ในการทำ CRUD (Create, read, update และ delete) เช่นใช้ GET ในการอ่านข้อมูล ใช้ POST/PUT ในการเขียนหรือัตเดต และใช้ DELETE ในการลบ เป็นต้น แต่ในปัจจุบัน เรื่องมีความคิดเห็นแตกแยก เพราะบางทีเราอาจจะไม่สามารถหา verb ที่เหมาะสมกับงานที่จะทำได้เลย บางท่านเลยบอกว่าให้ใช้ GET และ POST ก็พอ แล้วให้ระบุไว้ใน path เอาว่าจะทำ action อะไร ซึ่งข้อดีก็คืออ่านง่าย ใช้งานง่าย ข้อเสียก็คือทำให้ URL ยาวขึ้น และต้องคิดชื่อ

ตัวอย่าง RESTful Services แบบดั้งเดิม

curl http://varavut.com/portfolio/
curl -X POST -d <data> http://varavut.com/portfolio/items/
curl -X PUT -d <data> http://varavut.com/portfolio/items/1
curl -X DELETE http://varavut.com/portfolio/items/1

ตัวอย่าง RESTful Services แบบไม่สน verb

curl http://varavut.com/getPortfolio/
curl -X POST -d <data> http://varavut.com/addToPortfolio/
curl -X POST -d <data> http://varavut.com/updatePortfolioItem/1
curl -X POST http://varavut.com/removeFromPortfolio/1
  • Statelessness RESTful Services ไม่มีการเก็บ state ของ client นั่นแปลว่ามันจะไม่จดจำข้อมูลของ client เลย ทุกครั้งที่เราเรียกใช้ service เราต้องส่ง credential หรือข้อมูลต่างๆ ให้มันด้วย เพื่อ serive จะได้รู้ว่าเราคือใคร หรือจะทำงานให้เรายังไง การส่ง state ไปให้ service นั้นก็ทำได้โดยใส่ไว้ใน Path, query string, header หรือ body

ตัวอย่างการส่ง state ผ่าน query string

http://vable.me/profile/me?user_token=30189194-a0f0-4c28-b521-ffb47c7a929e
  • Links Between Resources เมื่อ resource สามารถมี relation ต่อกันได้ ดังนนั้น service จึงสามารถจ่าย resource ที่มีส่วนประกอบเป็น resources อื่นที่เกี่ยวข้องซ้อนกันไปได้ เช่น เมื่อเราต้องการ object ของ ห้องเรียน service ก็จะส่ง object ของห้องเรียนและสิ่งที่เกี่ยวข้องมาทั้งก้อน เช่น มีรายชื่อนักเรียน ครูที่ปรึกษา ตารางเรียน เป็นต้น

      <classroom>
      	<id>57</id>
      	<name><![CDATA[6/1]]><id>
      	<teachers>
      		<teacher>
          		...
          	</teachers>
          	<teacher>
          		...
          	</teachers>
          	...
      	</teachers>
      	<students>
      		<student>
          		...
          	</student>
          	<student>
          		...
          	</student>
          	...
      	</students>
      	...
      </classroom>
    
  • Caching RESTful Services จะยอมให้มีการ cache ผลลัพธ์ของการเรียกใช้งาน service ได้ ถ้ามีการเรียก service เดิมซ้ำๆ จะได้ไม่ต้องเสียเวลามาก ซึ่งการ cahce นี้สามารถทำโดย client เอง, server, proxy server, หรืออื่นๆ ก็ได้ (การ cache ผลลัพธ์นั้นอาจจะทำให้ client ไม่ได้ข้อมูลล่าสุด ดังนั้นจึงต้องระมัดระวังในการใช้งาน และตั้ง expire time ไว้เสมอ)

‪#‎day24 #365วันแห่งโปรแกรม ‪#‎โครงการ365วันแห่ง‬...