静的ファイル配信。jsonパース
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 |
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 } } |