/var/log/messages

debugging with sixth sense

Go で API 叩く件

なんかいいの発見。

何かで API を云々だったので使ってみようかな。

とりあえず

CircleCI のヤツを云々してみるか。とりあえず GET:/me してみます。サンプルをコピペして以下。

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
package main

import (
  "fmt"
  "gopkg.in/h2non/gentleman.v0"
)

func main() {
  // Create a new client
  cli := gentleman.New()

  // Define base URL
  cli.URL("http://circleci.com/api/v1/me?circle-token=fugahoge")

  // Create a new request based on the current client
  req := cli.Request()

  // Perform the request
  res, err := req.Send()
  if err != nil {
    fmt.Printf("Request error: %s\n", err)
    return
  }
  if !res.Ok {
    fmt.Printf("Invalid server response: %d\n", res.StatusCode)
    return
  }

  // Reads the whole body and returns it as string
  fmt.Printf("Body: %s", res.String())
}

とりあえず go build する前に

1
$ go get gopkg.in/h2non/gentleman.v0

が必要でした。というか gentleman 楽ですね。

POST もしてみます

例示されてるサンプルに沿って、あとスルして rochefort/gem-search なソレを folk させて頂いております。

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
package main

import (
  "fmt"
  "gopkg.in/h2non/gentleman.v0"
//  "gopkg.in/h2non/gentleman.v0/plugins/body"
)

func main() {
  // Create a new client
  cli := gentleman.New()

  // Define the Base URL
  cli.URL("https://circleci.com/api/v1/project/yamanetoshi/gem-search/tree/master?circle-token=fugahoge")

  // Create a new request based on the current client
  req := cli.Request()

  // Method to be used
  req.Method("POST")

  // Define the JSON payload via body plugin
//  data := map[string]string{"parallel": "null"}
//  req.Use(body.JSON(data))

  // Perform the request
  res, err := req.Send()
  if err != nil {
    fmt.Printf("Request error: %s\n", err)
    return
  }
  if !res.Ok {
    fmt.Printf("Invalid server response: %d\n", res.StatusCode)
    return
  }

  fmt.Printf("Status: %d\n", res.StatusCode)
  fmt.Printf("Body: %s", res.String())
}

ちなみに、上記な API ですが、一度は CircleCI の Web な i/f からプロジェクトを登録 (追加) しておく必要があるようでした。これってどうなんだろう。微妙と言わざるを得ないっす。

もひとつ

POST なソレは https になってないと 301 が戻ってきました。GET だと大丈夫だったのですが、これってどうなんでしょ。

json デコード

encoding/json なナニを import してレスポンスな文字列を

1
2
3
4
5
6
output := Output{}
err = json.Unmarshal(body, &output)
if err != nil {
    fmt.Println(err.Error())
    return
}

というカンジで良いのかどうか

駄目ぽ

どうも変換に失敗してるみたい。どうも json.Unmarshall では

  • レスポンス文字列の []byte なナニを渡す
  • 構造体を渡す

必要があるようで以下なソレを定義して

1
2
3
4
5
6
7
8
type Output struct {
    In_beta_program bool
    Selected_email string
    Avatar_url string
    Name string
    Login string
    Github_id int32
}

さしげる必要があったようです。先頭が大文字になってないと駄目みたい。あと snakecase なナニは InBetaProgram とかってするのかと思ってたらそうでもなかったです。

Comments