package main
import (
"fmt"
"bytes"
"encoding/json"
"net/http"
"io/ioutil"
)
const API_URL string = "https://android.googleapis.com/gcm/send"
const API_KEY string = "__API__KEY__"
type MessageData struct {
Score string `json:"score"`
Message string `json:"message"`
}
type Message struct {
RegistrationIds []string `json:"registration_ids"`
Data MessageData `json:"data"`
DryRun bool `json:"dry_run"`
}
func main() {
md := MessageData{
Score: "10.23",
Message: "中国很大",
}
m := Message{
RegistrationIds: []string{
"__REGISTRATION__ID__",
},
Data: md,
DryRun: true,
}
b, err := json.Marshal(m)
if err != nil {
panic(err)
}
body := bytes.NewReader(b)
client := &http.Client{}
req, _ := http.NewRequest("POST", API_URL, body)
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", "key=" + API_KEY)
res, _ := client.Do(req)
result, _ := ioutil.ReadAll(res.Body)
res.Body.Close()
fmt.Printf("%s\n", result)
}
ruby로 GCM 발송 코드를 만들고 테스트를 한뒤,
golang 으로도 한번 만들어 보았다.
golang 에 관심을 갖게 된건 언어가 병렬처리를 염두하고 설계되었다는 것을 알고 나서부터이다.
CPU 멀티코어의 시대에 언어도 발맞춰야 한다면서..ㅎㅎ
GCM 을 보내는 부분은 크게 2개로 나눌수 있다. 하나는 json 형식의 데이터를 만드는 것이고 다른 하나는 http request 처리이다.
1. JSON marshalling
재밌는 부분(?)은 struct 에서 bytes 형식의 데이터를 만들어 내는 json.Marshal() 함수이다.
json 데이터의 key 이름은 struct 선언부분에서 `json:“score”` 와 같은 형식으로 지정하게 된다.
type MessageData struct {
Score string `json:"score"`
Message string `json:"message"`
}
자세한 내용은 golang#package_json 을 참고.
2. HTTP Request
POST 방식의 http request 를 처리하는 부분이다.
너무 일반적인 내용이라 특별한 내용은 없다.
client := &http.Client{}
req, _ := http.NewRequest("POST", API_URL, body)
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", "key=" + API_KEY)
res, _ := client.Do(req)
http.Client 의 인스턴스를 할당 받고,
HttpRequest 인스턴스를 만들어 method 지정, url, 전송할 데이터를 포함해준뒤,
http.Client 인스턴스에서 Do() 함수를 호출해주면 된다.
자세한 내용은 golang#package_http 를 참고.

글을 정리하며..
ruby 로 작성한 코드에 비하면 너무 길고, 복잡한게 사실이다.
하지만 CPU 를 효율적으로 활용할 만한 데몬이나 작은 서버를 만드는 경우라면 충분히 고려해볼 만한 언어라고 생각된다.
예전에 golang 을 살펴보다 From zero to Go: launching on the Google homepage in 24 hours 를 보고 큰 감명을 받았다.
늘 실험적이고 연구적인 엔지니어들의 자세와 병렬처리를 위해 설계된 언어가 참 매력적이었다.