1. Home
  2. Golang
  3. GuideToBecomingGoDeveloper
  4. APIClients
  5. Grequests - Golang learning step 8-2

Grequests - Golang learning step 8-2

  • 公開日
  • カテゴリ:APIClients
  • タグ:Golang,roadmap.sh,学習メモ
Grequests - Golang learning step 8-2

roadmap.sh > Go > API Clients > REST > Grequests の学習を進めていきます。

※ 学習メモとしての記録ですが、後にこのセクションを学ぶ道しるべとなるよう、ですます調で記載しています。

contents

  1. 開発環境
  2. 参考 URL
  3. Grequests
    1. Grequests の特徴
  4. インストール
  5. 基本的な使い方
    1. GET リクエスト
    2. POST リクエスト
  6. エラー処理
  7. 並行処理との組み合わせ
  8. ファイルのダウンロード
  9. カスタムクッキーの利用
  10. レスポンスデータのパース

開発環境

  • チップ: Apple M2 Pro
  • OS: macOS Sonoma
  • go version: go1.23.2 darwin/arm64

参考 URL

Grequests

Grequests は、Go 言語で簡単に HTTP リクエストを送信するためのパッケージで、Python の Requests ライブラリに触発されています。シンプルなインターフェースで HTTP リクエストを扱えるため、HTTP クライアントを素早く実装したい場合に役立ちます。

Grequests は内部で net/http パッケージをラップしており、簡潔なインターフェースを提供します。特に、goroutine を活用した非同期処理や柔軟なオプション設定が可能であるため、HTTP クライアントを迅速に実装したい場面で有用です。

Grequests の特徴

  • シンプルなインターフェース:HTTP リクエストの送信が簡単にできる。
  • 並行処理に対応:Go の goroutine と相性が良い。
  • カスタマイズ可能:ヘッダー、クッキー、タイムアウトなどを柔軟に設定可能。

インストール

以下コマンドで Grequests をインストールします。

go get -u github.com/levigross/grequests

基本的な使い方

以下は、Grequests を使って GET リクエストを送る基本的なコード例です。

GET リクエスト

package main

import (
  "fmt"
  "github.com/levigross/grequests"
)

func main() {
  // リクエストオプションの設定
  ro := &grequests.RequestOptions{
    Headers: map[string]string{
      "User-Agent": "MyGoApp",
    },
  }

  // GET リクエストを送信
  resp, err := grequests.Get("https://jsonplaceholder.typicode.com/posts/1", ro)
  if err != nil {
    fmt.Println("リクエストに失敗しました:", err)
    return
  }

  // レスポンスを出力
  fmt.Println(resp.String())
}
  1. grequests.RequestOptions
    • リクエストのオプションを指定する構造体です。ヘッダーやクッキー、タイムアウトなどを設定できます。
  2. grequests.Get
    • 指定した URL に GET リクエストを送信します。レスポンスとエラーが返されます。
  3. レスポンスの処理
    • resp.String() を使ってレスポンスの内容を文字列として取得します。

実行結果

{
  "userId": 1,
  "id": 1,
  "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
  "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"
}

POST リクエスト

データを送信する場合のコード例を示します。

package main

import (
  "fmt"
  "github.com/levigross/grequests"
)

func main() {
  // 送信するデータ
  data := map[string]string{
    "title":  "foo",
    "body":   "bar",
    "userId": "1",
  }

  // リクエストオプションの設定
  ro := &grequests.RequestOptions{
    JSON: data, // JSON データを指定
  }

  // POST リクエストを送信
  resp, err := grequests.Post("https://jsonplaceholder.typicode.com/posts", ro)
  if err != nil {
    fmt.Println("リクエストに失敗しました:", err)
    return
  }

  // レスポンスを出力
  fmt.Println(resp.String())
}

実行結果

{
  "body": "bar",
  "title": "foo",
  "userId": "1",
  "id": 101
}

エラー処理

Grequests はエラー処理も簡単です。たとえば、タイムアウトやネットワークエラーが発生した場合に適切にエラーメッセージを表示できます。

ro := &grequests.RequestOptions{
  Timeout: 5 * time.Second, // タイムアウトを 5 秒に設定
}

並行処理との組み合わせ

Grequests の強みのひとつは、Go の goroutine を活用して複数の HTTP リクエストを並行して処理できる点です。

以下は、並行処理で複数のリクエストを送信する例です。

package main

import (
  "fmt"
  "sync"
  "github.com/levigross/grequests"
)

func fetchURL(wg *sync.WaitGroup, url string) {
  defer wg.Done()

  resp, err := grequests.Get(url, nil)
  if err != nil {
    fmt.Printf("リクエストに失敗しました: %s, エラー: %v\n", url, err)
    return
  }

  fmt.Printf("URL: %s, レスポンス: %s\n", url, resp.String())
}

func main() {
  urls := []string{
    "https://jsonplaceholder.typicode.com/posts/1",
    "https://jsonplaceholder.typicode.com/posts/2",
    "https://jsonplaceholder.typicode.com/posts/3",
  }

  var wg sync.WaitGroup
  for _, url := range urls {
    wg.Add(1)
    go fetchURL(&wg, url)
  }

  wg.Wait()
  fmt.Println("すべてのリクエストが完了しました")
}
  • sync.WaitGroup を使い、すべての goroutine が終了するまで待機します。
  • 各リクエストを goroutine で非同期に処理します。

実行結果

URL: https://jsonplaceholder.typicode.com/posts/1, レスポンス: {
  "userId": 1,
  "id": 1,
  "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
  "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"
}
URL: https://jsonplaceholder.typicode.com/posts/2, レスポンス: {
  "userId": 1,
  "id": 2,
  "title": "qui est esse",
  "body": "est rerum tempore vitae\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\nfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis\nqui aperiam non debitis possimus qui neque nisi nulla"
}
URL: https://jsonplaceholder.typicode.com/posts/3, レスポンス: {
  "userId": 1,
  "id": 3,
  "title": "ea molestias quasi exercitationem repellat qui ipsa sit aut",
  "body": "et iusto sed quo iure\nvoluptatem occaecati omnis eligendi aut ad\nvoluptatem doloribus vel accusantium quis pariatur\nmolestiae porro eius odio et labore et velit aut"
}
すべてのリクエストが完了しました

ファイルのダウンロード

Grequests は簡単にファイルをダウンロードする機能も提供します。

package main

import (
  "fmt"
  "github.com/levigross/grequests"
  "os"
)

func main() {
  resp, err := grequests.Get("https://placehold.jp/150x150.png", nil)
  if err != nil {
    fmt.Println("ファイルダウンロードに失敗しました:", err)
    return
  }
  defer resp.Close()

  file, err := os.Create("image.png")
  if err != nil {
    fmt.Println("ファイル作成に失敗しました:", err)
    return
  }
  defer file.Close()

  _, err = file.Write(resp.Bytes())
  if err != nil {
    fmt.Println("ファイル書き込みに失敗しました:", err)
    return
  }

  fmt.Println("ファイルのダウンロードが完了しました: image.png")
}

カスタムクッキーの利用

Web アプリケーションの API にアクセスする際、カスタムクッキーを設定する必要がある場合があります。

package main

import (
  "fmt"
  "net/http"
  "github.com/levigross/grequests"
)

func main() {
  // クッキーの設定
  cookies := []*http.Cookie{
    {
      Name:  "session_id",
      Value: "abc123",
    },
  }

  // リクエストオプションの設定
  ro := &grequests.RequestOptions{
    Cookies: cookies,
  }

  // リクエストを送信
  resp, err := grequests.Get("https://httpbin.org/cookies", ro)
  if err != nil {
    fmt.Println("リクエストに失敗しました:", err)
    return
  }

  // レスポンスを出力
  fmt.Println("レスポンス:", resp.String())
}

実行結果

レスポンス: {
  "cookies": {
    "session_id": "abc123"
  }
}

レスポンスデータのパース

API から JSON データを受け取る場合、レスポンスを構造体に変換する方法を学ぶと便利です。

package main

import (
  "encoding/json"
  "fmt"
  "github.com/levigross/grequests"
)

type Post struct {
  UserID int    `json:"userId"`
  ID     int    `json:"id"`
  Title  string `json:"title"`
  Body   string `json:"body"`
}

func main() {
  resp, err := grequests.Get("https://jsonplaceholder.typicode.com/posts/1", nil)
  if err != nil {
    fmt.Println("リクエストに失敗しました:", err)
    return
  }

  var post Post
  err = json.Unmarshal(resp.Bytes(), &post)
  if err != nil {
    fmt.Println("JSON パース失敗:", err)
    return
  }

  fmt.Printf("投稿情報: %+v\n", post)
}

実行結果

投稿情報: {
   UserID:1 
   ID:1 
   Title:sunt aut facere repellat provident occaecati excepturi optio reprehenderit 
   Body:quia et suscipit suscipit recusandae consequuntur expedita et cum reprehenderit molestiae ut ut quas totam nostrum rerum est autem sunt rem eveniet architecto
}

まとめ

  • Grequests は、Go 言語で HTTP リクエストを簡単に扱うための便利なパッケージ
  • シンプルなインターフェースと goroutine との高い親和性
  • GET、POST、並行処理、ファイルダウンロード、カスタムクッキーの利用が可能
  • grequests.RequestOptions により柔軟なリクエスト設定が可能
  • タイムアウトやエラー処理の設定が簡単
  • JSON パースやレスポンスデータの処理が容易


[Nexe] Step 8-3: Graphql go

[Prev] Step 8-1: Heimdall

Author

rito

  • Backend Engineer
  • Tokyo, Japan
  • PHP 5 技術者認定上級試験 認定者
  • 統計検定 3 級