Posted at

🙂< 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の詳細が表示されます。