Grequests - Golang learning step 8-2
- 公開日
- カテゴリ:APIClients
- タグ:Golang,roadmap.sh,学習メモ
roadmap.sh > Go > API Clients > REST > Grequests の学習を進めていきます。
※ 学習メモとしての記録ですが、後にこのセクションを学ぶ道しるべとなるよう、ですます調で記載しています。
contents
開発環境
- チップ: 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())
}
grequests.RequestOptions
- リクエストのオプションを指定する構造体です。ヘッダーやクッキー、タイムアウトなどを設定できます。
grequests.Get
- 指定した URL に GET リクエストを送信します。レスポンスとエラーが返されます。
- レスポンスの処理
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