Go 언어로 웹 프레임워크 "Echo"②(매개변수 처리 요청)

18324 단어 Goecho
모든 문장의 일람표는 여기에 있다.
Go 언어로 웹 사이트 만들기: 목록
http://qiita.com/y_ussie/items/8fcc3077274449478bc9
지난번 Hello World 편 1046791510에 이어
이번에는 요청 파라미터를 구해 봅시다.
이전 Hello World 편에서 HTML과 JSON은'Hello World'를 출력했고 이 문자열의'World'부분을 요구 매개 변수에 따라 전송해 보았다.
매개 변수를 받아들이는 방법은 다음과 같은 세 가지에 대응한다.
104679110 질의 매개변수(GET) 1046791810
104679110 형식(POST) 1046791810
  • JSON(POST)
  • 하고 싶은 일


    다음 요청을 처리합니다.

    GET /hello?greetingto=xxx


    검색 매개 변수에서 받은 "greetingto"매개 변수를 템플릿에 끼워넣기
    Hello xxx!
    의 문자열은 HTML을 통해 출력됩니다.

    GET /api/hello?greetingto=xxx


    조회 매개 변수를 통해 받은 "greetingto"매개 변수에 따라
    다음 JSON으로 돌아갑니다.
    {"hello": "xxx"}
    

    GET /hello_form


    다음 양식을 내보냅니다.
    http://qiita.com/y_ussie/items/ca8dc5e423eec318a436
    HTML 템플릿은 다음 코드입니다.
    template/hello_form.html
    {{define "content"}}
    <form action="/hello" method="POST">
        <label for="greetingto">Greeting To: </label>
        <input type="text" id="greetingto" name="greetingto" />
        <input type="submit" />
    </form>
    {{end}}
    

    POST /hello


    hello_form POST를 통해 얻은 "greetingto"매개 변수를 템플릿에 포함
    Hello xxx!
    의 문자열은 HTML을 통해 출력됩니다.

    POST /api/hello


    포스트 JSON.
    {"greetingto": "xxx"}
    
    에서 가져온 "greetingto"매개 변수에 따라
    다음 JSON으로 돌아갑니다.
    {"hello": "xxx"}
    

    지난번 코드에 추가해 봤어요.


    main.go
    package main
    
    import (
        "html/template"
        "io"
        "net/http"
    
        "github.com/labstack/echo"
        "github.com/labstack/echo/middleware"
    )
    
    // レイアウト適用済のテンプレートを保存するmap
    var templates map[string]*template.Template
    
    // Template はHTMLテンプレートを利用するためのRenderer Interfaceです。
    type Template struct {
    }
    
    // Render はHTMLテンプレートにデータを埋め込んだ結果をWriterに書き込みます。
    func (t *Template) Render(w io.Writer, name string, data interface{}, c echo.Context) error {
        return templates[name].ExecuteTemplate(w, "layout.html", data)
    }
    
    func main() {
        // Echoのインスタンスを生成
        e := echo.New()
    
        // テンプレートを利用するためのRendererの設定
        t := &Template{}
        e.Renderer = t
    
        // ミドルウェアを設定
        e.Use(middleware.Logger())
        e.Use(middleware.Recover())
    
        // 静的ファイルのパスを設定
        e.Static("/public/css/", "./public/css")
        e.Static("/public/js/", "./public/js/")
        e.Static("/public/img/", "./public/img/")
    
        // 各ルーティングに対するハンドラを設定
        e.GET("/", HandleIndexGet)
        e.GET("/hello", HandleHelloGet)
        e.POST("/hello", HandleHelloPost)
        e.GET("/hello_form", HandleHelloFormGet)
        e.GET("/api/hello", HandleAPIHelloGet)
        e.POST("/api/hello", HandleAPIHelloPost)
    
        // サーバーを開始
        e.Logger.Fatal(e.Start(":3000"))
    }
    
    // 初期化を行います。
    func init() {
        loadTemplates()
    }
    
    // 各HTMLテンプレートに共通レイアウトを適用した結果を保存します(初期化時に実行)。
    func loadTemplates() {
        var baseTemplate = "templates/layout.html"
        templates = make(map[string]*template.Template)
        templates["hello"] = template.Must(
            template.ParseFiles(baseTemplate, "templates/hello.html"))
        templates["hello_form"] = template.Must(
            template.ParseFiles(baseTemplate, "templates/hello_form.html"))
    }
    
    // HandleIndexGet は Index のGet時のHTMLデータ生成処理を行います。
    func HandleIndexGet(c echo.Context) error {
        return c.Render(http.StatusOK, "hello", "world")
    }
    
    // HandleHelloGet は /hello のGet時のHTMLデータ生成処理を行います。
    func HandleHelloGet(c echo.Context) error {
        greetingto := c.QueryParam("greetingto")
        return c.Render(http.StatusOK, "hello", greetingto)
    }
    
    // HandleHelloPost は /hello のPost時のHTMLデータ生成処理を行います。
    func HandleHelloPost(c echo.Context) error {
        greetingto := c.FormValue("greetingto")
        return c.Render(http.StatusOK, "hello", greetingto)
    }
    
    // HandleHelloFormGet は /hello_form のGet時のHTMLデータ生成処理を行います。
    func HandleHelloFormGet(c echo.Context) error {
        return c.Render(http.StatusOK, "hello_form", nil)
    }
    
    // HandleAPIHelloGet は /api/hello のGet時のJSONデータ生成処理を行います。
    func HandleAPIHelloGet(c echo.Context) error {
        greetingto := c.QueryParam("greetingto")
        return c.JSON(http.StatusOK, map[string]interface{}{"hello": greetingto})
    }
    
    // HelloParam は /api/hello が受けとるJSONパラメータを定義します。
    type HelloParam struct {
        GreetingTo string `json:"greetingto"`
    }
    
    // HandleAPIHelloPost は /api/hello のPost時のJSONデータ生成処理を行います。
    func HandleAPIHelloPost(c echo.Context) error {
        param := new(HelloParam)
        if err := c.Bind(param); err != nil {
            return err
        }
        return c.JSON(http.StatusOK, map[string]interface{}{"hello": param.GreetingTo})
    }
    
    지난번 코드를 바탕으로 이번 기능을 추가해 봤습니다.
    주로 창에 표시되는 프로세서HandleHelloFormGet () 와POST용 프로세서가 추가되었습니다
    HandleHelloPost(),HandleAPI HelloPost().
    HandleHelloGet()과 HandleAPI HelloGet()에서 질의 매개변수 처리가 증가하고 있습니다.
    질의 매개 변수는 echo입니다.Context#QueryParam()에서 사용할 수 있습니다.
    HandleHelloPost()는 양식 매개변수 POST를 적용합니다.
    표 매개 변수는 echo입니다.Context#FormValue()를 통해 가져올 수 있습니다.
    HandleAPIHelloPost()는 JSON POST 처리를 받습니다.
    POST 이후의 JSON 매개 변수를 얻기 위해 먼저 JSON을 수신하는 구조체를 준비하고 구조체를
    echo.Context#Bind()를 통해 구조체의 멤버로 사용할 수 있습니다.

    실행 결과


    POST /hello



    POST /api/hello



    다음 계획


    쿠키 한번 해볼래요?

    좋은 웹페이지 즐겨찾기