วันศุกร์ที่ 14 กุมภาพันธ์ พ.ศ. 2557

ลองเขียน REST API ด้วย Go (with framework)

ก่อนนี้ลองเขียน web application ด้วย pure Go มาแล้ว และได้เห็นพิษสงของ Go พอสมควร คราวนี้ขอลอง REST API สักหน่อย แต่อยากได้แบบ ง่ายมากๆ ประมาณ KISS เลย (Keep It Siimple & Studip) เลยขอลองใช้ Framework ในตลาดดูบ้าง

ผมเลือก http://github.com/ant0ine/go-json-rest มาลองเล่นเป็นตัวแรก เริ่มเลย...

สร้างไฟล์ชื่อ restmain.go (หรืออะไรก็ได้)
แทรก import ก่อน

import (
   "net/http"
   "github.com/ant0ine/go-json-rest"
)

แล้วสร้าง func main

func main() {
handler := rest.ResourceHandler{}
handler.SetRoutes(
rest.Route{"Get", "/users/:id", GetUser},
)
http.ListenAndServe(":8080", &handler)
}

อธิบายได้ว่า ประกาศ handler ด้าย rest ของ go-json-rest แล้ว SetRoutes ไปที่ url ที่เราต้องการ จากนั้นยัดเข้าท่ามาตรฐานของ net/http package ของ Go

ไปดูที่ handler กัน

func GetUser(w *rest.ResponseWriter, req *rest.Request) {
user := User{
Id:   req.PathParam("id"),
Name: "McDuck",
}
w.WriteJson(&user)
}

ทดลองง่ายๆ ด้วยการส่งอะไรมา (ผ่าน url parameter) ก็จัดการส่งกลับ (ด้วย json format) เราก็ต้องสร้าง struct สำหรับการเก็บข้อมูลก่อนแปลงเป็น json

type User struct {
Id   string
Name string
}

แล้วก็ assign (:=) user โดยมี Id = ค่า id ที่ส่งผ่านมาทาง url parameter และ name (อันนี้ใส่เอง) จากนั้นใช้ res.ResponseWriter เขียน Json กลับไปที่ resquester

ก่อน run set GOPATH ก่อน (path เดียวกับ ที่เราเขียน code ด้านบน...)
$ export GOPATH=`pwd`

(windows platform ไปหาทางเอาเอง นาทีนี้กำลังงอล Windows,  Hang อยู่ได้ แม่ม...)

จากนั้นเรียก
$ go get .
go จะ download source มาจาก github.com/ant0ine/go-json-rest ไว้ที่ src ให้เรา จากนั้น
$ go run restmain.go

แล้วเปิด browser ไปที่ http://localhost:8080/users/1001100
Result :

{
  "Id": "10010",
  "Name": "McDuck"
}

[ง่ายดีจังตังค์อยู่ครบ]

source restmain.go

//-------------------------------------------------------------
package main

import (
 "github.com/ant0ine/go-json-rest"
 "net/http"
)

type User struct {
 Id   string
 Name string
}

func GetUser(w *rest.ResponseWriter, req *rest.Request) {
 user := User{
  Id:   req.PathParam("id"),
  Name: "McDuck",
 }
 w.WriteJson(&user)
}

func main() {
 handler := rest.ResourceHandler{}
 handler.SetRoutes(
  rest.Route{"Get", "/users/:id", GetUser},
 )
 http.ListenAndServe(":8080", &handler)
}

//-------------------------------------------------------------

ไม่มีความคิดเห็น:

แสดงความคิดเห็น