up1 on September 24th, 2008

RESTful with Grails

วันนี้ไปอ่านเจอบทความเรื่อง Mastering Grails: RESTful Grails ประจวบเหมาะกับหลายๆ วันที่ผ่านมาผมนั่งทำแต่ services api ที่มี data exchange format เป็น XML, JSON ผ่าน GET/POST HTTP เลยมองมาดูที่ตัว Grails ว่าสนับสนุนการทำงานเช่นเดียวกับที่ผมทำอยู๋หรือเปล่า อย่างไร และที่สำคัญมันง่ายไหม ??

….. ซึ่งพบว่า Grails นั้นได้เตรียมสิ่งต่างๆ ไว้ให้ ใช้งานสะดวกมาก ถูกใจวัยรุ่นอย่างผมมาก … ^_^

เรามาเริ่มดูการสร้าง XML และ JSON โดยการใช้ API grails.converters.* ซึ่งเป็น APIs ที่ Grails จัดเตรียมไว้ให้
ตัวอย่างการใช้งาน
$grails create-domain-class Book

class Book {
	String title
	Integer pages
	Date publish_date
}

$grails create-controller Book

import grails.converters.*

class BookController {
    def scaffold = true
    def  xml = { render Book.list() as XML  }  // สร้าง XML Data
    def json = {  render Book.list() as JSON   }  // สร้าง JSON Data
}

ทดสอบการทำงาน
1. Add ข้อมูล
2. เรียกใช้งาน ดังนี้
… /book/xml
…/book/json

ผลการทำงานดังรูป

ถ้าต้องการ Custom XML เองก็สามารถทำได้ดังนี้

def custom_xml = {
	def book_list = Book.list()
	render( contentType:"text/xml" ) {
		service{
			"service-result" {
				code( "200" )
				description ( "Success" )
			}
			books {
				for( a in book_list ) {
					book( id:a.id ) {
						title( a.title )
						publish_date( a.publish_date )
					}
				}
			}
		}
	}
}

ผลการทำงานเป็นดังรูป

ส่วนที่น่าสนใจอีกคือ RESTful เป็นกระแสที่ได้ยินมาจากหลายๆ สำนัก มันคืออะไรผมไม่ขออธิบายตามไปอ่านที่นี่ล่ะกันครับ
REST

มาสนใจใน Grails ดีกว่า ….ถ้าต้องการให้ support REST แล้วนั้นสามารถทำได้ง่ายๆ ดังนี้
1. ทำการตรวจสอบ method ของ request ตรงๆ เลยว่าจะให้ไปทำงานอะไร ตาม spec ของ REST นั้น HTTP Request แต่ละชนิดทำงานต่างกันดังนี้

POST = Create
GET = Get/Retrive
PUT = Update
Delete = Delete

ตัวอย่าง

def test_rest = {
	switch( request.method ) {
		case "POST" :
			render "<h1>Create Book</h1>\n"
			break
		case "GET" :
			render "<h1>Get Book</h1>\n"
			break
		case "PUT" :
			render "<h1>UpdateBook</h1>\n"
			break
		case "DELETE" :
			render "<h1>Delete Book</h1>\n"
			break
	}
}

ผลการทำงานผ่าน curl ตามเอกสารข้างบนอย่างกับแกะ

เราสามารถประยุกต์การสร้าง xml, json ด้านบนมาใส่ในส่วนของ HTTP GET ได้ครับ … ง่ายมากๆ ลองดูทำดูครับ …

อีกวิธีสามารถ config ใน grails-app/conf/UrlMapping.groovy ได้ครับ ดังนี้
ผมกำหนดใน controller ชื่อ book

POST จะเรียกใช้งาน save action ใน controller
GET จะเรียกใช้งาน show action ใน controller
PUT จะเรียกใช้งาน update action ใน controller
DELETE จะเรียกใช้งาน delete action ใน controller

static mappings = {
   "/book/$id?"(controller:"book"){
       action = [GET:"show", PUT:"update", DELETE:"delete", POST:"save"]
   }
}

จะเป็นการกำหนดให้แต่ละ Controller ไปเลยครับ ง่ายดีไหมครับ ^_^

———————————————————————————-

ยังมีเรื่อง Feed เช่น RSS และ Atom เห็นมีการพูดถึงใน Rails66 ที่ การอ่าน RSS feed ด้วย Ruby (ใช้กับ Rails ก็ได้) ใน grails นั้นจะไม่ support โดยตรง แต่สามารถใช้แนวคิดเดียวกับ Custom XML ได้ ครับ หรือจะใช้ Feed Plug-in ที่ชาวบ้านเขาสร้างไว้ให้ใช้ได้ครับ มันใช้ library ของ ROME มาช่วย ทำให้ชีวิตง่ายขึ้นมากครับ

Tags: , , , ,

2 Responses to “RESTful with Grails”

  1. ใน Rails มี concept ของ ActiveResource
    ถ้าจำไม่ผิดมันจะยอมให้มีการ request ไปหา resource อื่นด้วย คือเป็นทั้ง provider (แบบนี้) และ consumer
    ผมว่าน่าสนใจใช้ได้เลย

    งานพี่ทำพวกนี้อยู่รึปล่าวครับ

  2. ตอนนี้ยังทำเฉพาะ provider ครับ

    ส่วน consumer ตามแนวคิดของ ActiveResource ก็น่าสนใจครับ ซึ่งคาดว่าจะต้องใช้แน่ๆ

Leave a Reply