/var/log/messages

Feb 27, 2016 - 2 minute read - Comments - Go

Go で API 叩く件

なんかいいの発見。

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

とりあえず

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

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 する前に

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

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

POST もしてみます

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

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 してレスポンスな文字列を

    output := Output{}
    err = json.Unmarshal(body, &output)
    if err != nil {
        fmt.Println(err.Error())
        return
    }

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

駄目ぽ

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

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

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

type Output struct {
    In_beta_program bool
    Selected_email string
    Avatar_url string
    Name string
    Login string
    Github_id int32
}

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

blacklabelops/jenkins 確認 認証文字列の隠し方

comments powered by Disqus