Go로 RESTful 웹 앱을 만들고 싶습니다 (go-restful을 만져보세요)

10934 단어 5JSONrest

개요



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(&param)

    // 適当なエラーハンドリング
    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이라는 것을 알고 있지만 WriteHeaderAndJsonrestful.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에서 HTTP 서버와 일체형 앱은 의외로 바삭바삭하게 만들 수 있었다.
  • 샘플 코드도 많아 GoDoc 대응에도 대응하고 있었기 때문에 비교적 안심.
  • htps: //아이 c. rg/기테우 b. 고 m / 에미 CK
  • htps : // 기주 b. 코 m / 에미 CK ぇ이 / gore st fu l / t ree / Ma s r / E mp ぇ s

  • go-restful은 XML의 응답에도 대응하고있는 모습.
  • Web 앱은 PHP(CakePHP나 Laravel)나 Ruby(Rails, Sinatra) 등으로 만드는 이미지가 강하지만,
    Go로 실운용하거나 해서 문제가 되거나 하지 않을지는 미지수. net/http 벤치 마크가 있습니까?
  • 좋은 웹페이지 즐겨찾기