package main
import (
"encoding/json"
"io/ioutil"
"log"
"net/http"
"os"
"path/filepath"
)
func main() {
//静的ファイル配信
//http.Dirはhttp://foo:bar/のようなクエリのないURLがローカルのどのパス(root)となるかという意味
//http://foo:bar/aaaのような指定の場合/aaaもローカルパスに必要となる。
currentPath, _ := os.Executable()
localRoot := filepath.Dir(currentPath)
remoteRoot := http.Dir(localRoot)
http.Handle("/", http.FileServer(remoteRoot))
//パスを変更する場合
//http.Handle("/html/", http.StripPrefix("/html/", http.FileServer(remoteRoot)))
//リクエスト処理
http.HandleFunc("/read", read)
if err := http.ListenAndServe(":9000", nil); err != nil {
log.Fatal(err)
}
}
var dt interface{}
/*
type DataFormat struct {
RequestID string
}
のように構造体を宣言し、インスタンスでjson.Unmarshalを受ける。
dt := DataFormat{}
*/
func read(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodPost {
w.WriteHeader(http.StatusServiceUnavailable)
return
}
/*
json.Unmarshal(data []byte, v interface{}) error
でjsonを受け取る
io.Readerから[]byteに変換
ioutil.ReadAll(io.Reader) ([]bytes, error)
bytes.Buffer.ReadFrom(io.Reader) (int64, error)
io.Copy(io.Writer, io.Reader) (int64, error)
*/
body, err := ioutil.ReadAll(r.Body)
if err != nil {
w.WriteHeader(http.StatusServiceUnavailable)
log.Print(err)
return
}
if err := json.Unmarshal(body, &dt); err != nil {
w.WriteHeader(http.StatusServiceUnavailable)
log.Print(err)
return
}
//dtはinterface型で実際はmap型
/*
jsonがネストしていない場合アサーションのみで取り出せる。
d := dt.(map[string]interface{})
log.Print(d["main"])
log.Print(reflect.TypeOf(d)) -> map[string]interface {}
全体が配列のjsonなら以下のように取り出せる
配列は[]interface{}のrangeで処理
for _, aa := range dt.([]interface{}) {
for cc, bb := range aa.(map[string]interface{}) {
log.Print(cc)
log.Print(bb)
}
}
中で配列ネストされているような場合
for k, v := range dt.(map[string]interface{}) {
log.Print("1:", k) //jsonのkeyが入る
log.Print("2:", v) //jsonのvalueが入る
//vとvvは同じ値で型のtypeOfが入るのではない
switch vv := v.(type) {
case []interface{}:
for _, y := range vv {
yy := y.(map[string]interface{})
log.Print("3:", yy["ID"])
log.Print("4:", yy["名称"])
}
default:
log.Print("5:", v)
}
}
*/
w.Header().Set("content-type", "application/json;charset=UTF-8")
w.WriteHeader(http.StatusOK)
if err := json.NewEncoder(w).Encode(dt); err != nil {
w.WriteHeader(http.StatusServiceUnavailable)
log.Print(err)
return
}
}