Go
AWS
golang
GoogleAppEngine
GoogleCloudPlatform

🙂< golang+gae+net/http+json+post+getでのapiです

はじめに

golang+gae+datasourceでJSONを返すwebAPIを作る為に必要な知識としてメモをしています。今回はWAFを使わず、net/httpを利用します。

コード

main.go
package main

import (
    "encoding/json"
    "fmt"
    "io"
    "log"
    "net/http"
    "strconv"
)

type User struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

func init() {
    http.HandleFunc("/", helloHandler)
}

func helloHandler(w http.ResponseWriter, req *http.Request) {
    switch req.Method {
    case http.MethodGet:
        user := User{ Name: "Taro",  Age:  20 }
        res, err := json.Marshal(user)
        if err != nil {
            log.Print("😇json marshal error.")
            http.Error(w, err.Error(), http.StatusInternalServerError)
            return
        }
        w.Header().Set("Content-Type", "application/json")
        w.Write(res)
    case http.MethodPost:
        if req.Header.Get("Content-Type") != "application/json" {
            w.WriteHeader(http.StatusBadRequest)
            return
        } else {
            log.Print("🙃application/json")
        }

        length, err := strconv.Atoi(req.Header.Get("Content-Length"))
        if err != nil {
            log.Print("😇Content-LengthがnilだからStatusInternalServerError")
            w.WriteHeader(http.StatusInternalServerError)
            return
        } else {
            log.Print("🙃lengthは", length, "バイトです。")
        }

        var user User
        buffer := make([]byte, length)

        _, err = req.Body.Read(buffer)

        if err != nil && err != io.EOF {
            w.WriteHeader(http.StatusInternalServerError)
            return
        }

        err = json.Unmarshal(buffer, &user)
        if err != nil {
            log.Print("😇Json Unmarshal Error ")
        }

        fmt.Fprintf(w, "%v\n", user)
        w.WriteHeader(http.StatusOK)
    default:
        fmt.Fprintf(w, "Default ")
        w.WriteHeader(http.StatusOK)
    }
}

app.yaml
runtime: go
api_version: go1

handlers:
- url: /.*
  script: _go_app

起動

ローカル開発環境の場合はlocalhost:8080/にアクセスできます。

terminal
$ dev_appserver.py app.yaml 

google app engineにデプロイする場合は、以下のコマンドを打ちましょう。

terminal
$ gcloud app deploy
$ gcloud app browse

リクエストを出す

Postman等を用いてもよいですが、今回はcurlでいきます。ローカル開発環境にリクエストを叩いてきます。

terminal(GET)
$ curl -v localhost:8080
$ curl -X POST -H "Content-Type: application/json" -d {"name":"taro","age":10} localhost:8080 | python -m json.tool
terminal(POST)
$ curl -v -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{"name":"Taro","age":25}'  http://localhost:8080

蛇足ですが、curl -vRequestResponseの詳細が表示されます。