2014年7月12日土曜日

Golang Cafe #37を開催しました。

Golang Cafe #37を開催しました。

今回は、Gmail APIをGoで実行するというテーマで進めました。
OAuth2の認証が必要だったので、#18のサンプルコードを見ながら実行するというアプローチをとりました。

goauth2パッケージは結構便利に使えるので良いですね。

リクエストを送信する所は、以前と同じなので、省略するとして、受信後にデータを展開する所は、レスポンスがjson文字列なので、encoding/jsonを使って、Unmarshal()をすればオブジェクトに復元できます。

最初にUsers.messages.listにリクエストを投げました。これは、Gmailのメールのリストが返ってきますが、本文は含まれていません。

    // Users.messages.listにアクセス
    r, err := transport.Client().Get(request_url)
    if err != nil {
        fmt.Println("Get: ", err)
        return
    }

    defer r.Body.Close()

    buf := bytes.Buffer{}
    if _, err = buf.ReadFrom(r.Body); err != nil {
     log.Fatalln(err)
    }

    if err = json.Unmarshal(buf.Bytes(), &l); err != nil {
     fmt.Println(buf.String())
     log.Fatalln(err)
    }

goauth2のtransportから戻ってくるのはio.Readerなので、bytes.Bufferにでもコピーして書き出さないとUnmarshal()に渡す事ができないので、一つ処理を入れています。

jsonをオブジェクトに変換した後は、もう一度、Users.messages.getにリクエストを投げて、詳細を取得しました。

    // Users.messages.getにアクセス。(最初の1件目)
 r2, err := transport.Client().Get(message_get_url + l.Messages[0].Id)
 if err != nil {
        fmt.Println("Get: ", err)
        return
 }

    // // Write the response to standard output.
    // io.Copy(os.Stdout, r2.Body)

    buf2 := bytes.Buffer{}
    if _, err = buf2.ReadFrom(r2.Body); err != nil {
     log.Fatalln(err)
    }

    if err = json.Unmarshal(buf2.Bytes(), &t); err != nil {
     fmt.Println(buf2.String())
     log.Fatalln(err)
    }

これで、中身が取得できたのですが、本文がBase64エンコードでエンコードされた状態だったので、復元しないといけなかったのですが、復元には至らず。ここで終了。

それでも、後日時間を取って、粘ってみたら、Base64.Stdencodingを使っていたのを、Base64.URLencodingを使えば本文が読めるようになるというのを+Takanobu Haginoさんが見つけていたので、それを適用して本文が読めるようになりました。
    // 本文をエンコードする場合はURLEncodingを使う。
    data, encerr := base64.URLEncoding.DecodeString(string(t.Payload.Body.Data))
    if encerr != nil {
        // fmt.Println("base64", t.Payload.Body.Data[190])
        log.Fatalln(encerr)
    }

あと、q=is:unreadをつけてリクエストを送信したりしたものがありますが、今は時間がないので、あとで、githubに上げておこうと思います。