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 มาช่วย ทำให้ชีวิตง่ายขึ้นมากครับ


September 25th, 2008 at 6:21 pm
ใน Rails มี concept ของ ActiveResource
ถ้าจำไม่ผิดมันจะยอมให้มีการ request ไปหา resource อื่นด้วย คือเป็นทั้ง provider (แบบนี้) และ consumer
ผมว่าน่าสนใจใช้ได้เลย
งานพี่ทำพวกนี้อยู่รึปล่าวครับ
September 26th, 2008 at 12:38 am
ตอนนี้ยังทำเฉพาะ provider ครับ
ส่วน consumer ตามแนวคิดของ ActiveResource ก็น่าสนใจครับ ซึ่งคาดว่าจะต้องใช้แน่ๆ