GoLang全然わからん ~httpレスポンス&リクエスト編~
目次
	
はじめに
全くGoLangを知らん私が、Windows 11 + WSL2(Ubuntu 21.04) + Visual Studio Codeで勉強していくログです。

記事一覧
- インストール編
 - httpレスポンス&リクエスト編 (今回の記事)
 - Docker build編
 
やったこと
net/http モジュールを使って、httpリスナーを起動、別の端末からアクセスしてLINE Norifyへ通知を行うのをやってみた。
以下ソース(httpd.go)
package main
import (
	"fmt"
	"log"
	"net/http"
	"net/url"
	"os"
	"strings"
)
// http handler
func handler(w http.ResponseWriter, r *http.Request) {
	fmt.Printf("msg=[%s]\n", r.FormValue("msg"))
	// get message parameter
	msg := r.FormValue("msg")
	if msg == "" {
		msg = "no msg"
	}
	// get line token
	line_token := r.FormValue("token") // first try from parameter
	if line_token == "" {
		line_token = os.Getenv("LINE_TOKEN") // second try from environment parameter
		if line_token == "" {
			log.Fatal("can't get token")
		}
	}
	URL := "https://notify-api.line.me/api/notify"
	u, err := url.ParseRequestURI(URL)
	if err != nil {
		log.Fatal(err)
	}
	client := &http.Client{}
	form := url.Values{}
	form.Add("message", msg)
	body := strings.NewReader(form.Encode())
	req, err := http.NewRequest("POST", u.String(), body)
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
	req.Header.Set("Authorization", "Bearer "+line_token)
	_, err = client.Do(req)
	if err != nil {
		log.Fatal(err)
	}
}
func main() {
	http.HandleFunc("/", handler)
	http.ListenAndServe(":8080", nil)
}
動かした
LINE NotifyのTOKENはLINE Notifyのサイトから既に取得済み。
上記プログラムでは、環境変数もしくはGETメソッドのtokenパラメータで指定できるようにした。実際に送るメッセージはmsgパラメータで指定する。
サーバ側は以下のようにして起動しました。
$ LINE_TOKEN=<<LINE NotifyのTOKEN>> go run httpd.go 
これで、localhost:8080で待ち受けするので、別端末から以下のようにリクエスト
$ curl "localhost:8080?msg=こんにちは"
はい、ばっちり通知が届きました。

別のLINE端末に送りたいときにはtokenパラメータを指定して以下のように呼べば良いです。
$ curl "localhost:8080/asd?msg=こんにちは&token=<<LINE NotifyのTOKEN>>"
今回のまとめ
- 基本的なモジュールは使えるようにならないとだめ(C言語でいうと、stdio.h, stdlib.h, string.h あたり?)
 - 変数名などのつけ方にも一定のルールがあるようなので、今後は調査して気を付けていこう
 - どうしてもC言語的な記述になってしまうが、GoLangのお作法も習うようにしよう
 - エラー処理とかは微妙かもだけど、とりあえずhttpリクエスト系の処理が書けたので、検証レベルのプログラムならなんとかなるかも