Go로 RESTful 웹 앱을 만들고 싶습니다 (go-restful을 만져보세요)
개요
Go로 API서버를 쓰려고 하면 어떻게 될까 라고 생각했기 때문에 해 보았다.
API의 응답은 JSON 형식으로 실시해, 덧붙여 대시보드 같은 UI도 제공할 수 있는 것을 상정하고 있다.
DB라든지 디자인이라든지는 각각 다른 레이어가 되므로 이번은 리퀘스트와 리스폰스까지.
준비
이번에 사용하는 것은
go-restful
라는 패키지. RESTful HTTP 서버를 만드는 데 사용하는 모습.htps : // 기주 b. 코 m / 에미 CK ㅇ / 고레 st 후
미리
go get
해 둡시다.go get github.com/emicklei/go-restful
비슷한 것으로
go-json-rest
라고 하는 것도 있었지만, JSON에서의 대답 전용인 것 같았기 때문에 이번은 패스했다.코드 전문
코드를 설명해 돌리는 것도 몹시 길어지므로 싣고 내보낸다
package main
import (
"github.com/emicklei/go-restful"
"io"
"net/http"
)
// Helloに渡す値を格納する
type resHello struct {
Name string
Memo string `json:",omitempty"`
}
// エラーレスポンス用の構造体
type resError struct {
Error string
}
// "GET /hello" を処理する関数
func getHello(req *restful.Request, resp *restful.Response) {
// GETのときは text/plain で文字列を返す
io.WriteString(resp, "please tell me your name to /hello by POST method :)")
}
// "POST /hello" を処理する関数
func postHello(req *restful.Request, resp *restful.Response) {
// リクエストを resHello に割り当てる
param := new(resHello)
req.ReadEntity(¶m)
// 適当なエラーハンドリング
if param.Name == "" {
// エラーの内容をJSONで返す
resp.WriteHeaderAndJson(http.StatusInternalServerError, &resError{"Name is required"}, restful.MIME_JSON)
return
}
// 結果を出力する (自動で application/json が指定される)
resp.WriteAsJson(&resHello{Name: param.Name})
}
func main() {
// restfulを初期化してルーティングの設定を行う
ws := new(restful.WebService)
ws.Route(ws.GET("/hello").To(getHello))
ws.Route(ws.POST("/hello").To(postHello))
restful.Add(ws)
// 8080ポートで待ち受ける
http.ListenAndServe(":8080", nil)
}
실행 결과
위의 코드는
go run
로 서버를 시작할 수 있습니다.시작한 서버에는 브라우저 액세스 또는 cURL로 액세스할 수 있다.
GET /hello
브라우저나 cURL로 http://localhost:8080/hello에 액세스하면 아래와 같은 결과를 얻을 수 있다.
$ curl -i http://127.0.0.1:8080/hello
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 52 100 52 0 0 3250 0 --:--:-- --:--:-- --:--:-- 3250HTTP/1.1 200 OK
Date: Sat, 02 Jan 2016 13:20:14 GMT
Content-Length: 52
Content-Type: text/plain; charset=utf-8
please tell me your name to /hello by POST method :)
덧붙여서 굳이 지정을 넣지 않은
/
는 404 Page Not Found
가 된다$ curl -i http://127.0.0.1:8080/
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 19 100 19 0 0 19 0 0:00:01 --:--:-- 0:00:01 19000HTTP/1.1 404 Not Found
Date: Sat, 02 Jan 2016 13:20:42 GMT
Content-Length: 19
Content-Type: text/plain; charset=utf-8
404: Page Not Found
POST /hello
cURL을 사용하여 POST를 두드리면 아래와 같은 응답이 된다.
WriteAsJson
에서 Content-type은 잘 해줍니다.resHello
에서 Memo
로 지정한 omitempty
(빈 때는 잘림)는 유효한 모습.$ curl -i -H 'Content-Type: application/json' -d '{"Name":"Gopher"}' http://127.0.0.1:8080/hello
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 40 100 23 100 17 1437 1062 --:--:-- --:--:-- --:--:-- 1437HTTP/1.1 200 OK
Content-Type: application/json
Date: Sat, 02 Jan 2016 13:11:48 GMT
Content-Length: 23
{
"Name": "Gopher"
}
덧붙여서 에러 핸들링하고 있는 개소는 이러한 응답이 된다.
JSON이라는 것을 알고 있지만
WriteHeaderAndJson
에 restful.MIME_JSON
를 지정해야합니다.조금 미묘할지도 생각했지만, 어쩌면 사용거리가 따로 있을지도 모른다.
$ curl -i -H 'Content-Type: application/json' -d '{"Name":""}' http://127.0.0.1:8080/hello
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 45 100 34 100 11 2125 687 --:--:-- --:--:-- --:--:-- 2125HTTP/1.1 500 Internal Server Error
Content-Type: application/json
Date: Sat, 02 Jan 2016 13:09:46 GMT
Content-Length: 34
{
"Error": "Name is required"
}
감상
Go로 실운용하거나 해서 문제가 되거나 하지 않을지는 미지수.
net/http
벤치 마크가 있습니까? Reference
이 문제에 관하여(Go로 RESTful 웹 앱을 만들고 싶습니다 (go-restful을 만져보세요)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/dojineko/items/98b3dd661871f63190d1텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)