Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Make a REST Server on Golang

cupper
August 07, 2019

Make a REST Server on Golang

cupper

August 07, 2019
Tweet

More Decks by cupper

Other Decks in Programming

Transcript

  1. エディタ Visual Studio Codeを使用 いろいろなプラグインがあって便利 • Microsoft Remote Containers •

    Microsoft Go language support • Vetur • Microsoft Remote SSH • Microsoft Live Share
  2. Main 各モジュールを用意し、クライアントからの受付を開始 する。 repo, err := repository.NewRepository(&config) service := service.DicService

    { Repo: repo } // コンストラクタインジェクション wc := controller.WordController { Service: service } router := mux.NewRouter() sub := router.PathPrefix("/word/").Subrouter() sub.HandleFunc("/histories", wc.GetHistories).Methods("GET") ・・・ http.Handle("/", router) http.ListenAndServe(":80", nil)
  3. Router 各パスにControllerの関数を割り当てる router := mux.NewRouter() sub := router.PathPrefix("/word/").Subrouter() sub.HandleFunc("/histories", wc.GetHistories).Methods("GET")

    sub.HandleFunc("/", wc.AddWord).Methods("POST") sub.HandleFunc("/{id:[0-9]+}/example", wc.GetExamples).Methods("GET") sub.HandleFunc("/{id:[0-9]+}/example", wc.AddExample).Methods("POST") ※ gorillaを使用。net/httpでもルーティングの設定はできるが、メソッド やパスのパターンによる割り振りができない。
  4. Message type Word struct { Id int `json:"id"` Content string

    `json:"content"` CreateDate time.Time `json:"create_date"` UpdateDate time.Time `json:"update_date"` ReferenceDate time.Time `json:"reference_date"` } type Example struct { Id int `json:"id"` WordId int `json:"word_id"` Content string `json:"content"` CreateDate time.Time `json:"create_date"` UpdateDate time.Time `json:"update_date"` }
  5. Service ビジネスロジック func (o *DicService) AddWordIfNotExist(word *Word) error { w,

    err := o.Repo.GetWord(word) if err != nil { return err } if w == nil { return o.Repo.AddWord(word) } else { return err } }
  6. Repository 永続化を行うインターフェース type WordRepository interface { AddWord(word *Word) error GetWord(word

    *Word) (*Word, error) GetWords(order string, limit int) ([]Word, error) AddExample(example *Example) error GetExamples(word *Word) ([]Example, error) Close() }
  7. xerrors func readFile(filename string) error { fp, err := os.Open(filename)

    if err != nil { return xerrors.Errorf("Can not open file.: %w", err) } defer fp.Close() reader := bufio.NewReaderSize(fp, 4096) for line := ""; err == nil; line, err = reader.ReadString('\n') { fmt.Print(line) } if err != io.EOF { return xerrors.Errorf("Can not read file: %w", err) } else { return nil } }