# Golang

> Proxyman の Automatic Setup で Go アプリの HTTP/HTTPS 通信をキャプチャします。net/http、fasthttp、resty、gorequest、req、grequests に対応しています。

## 1. 新しい自動設定の方法（macOS v5.17.0 以降）✅ {#1-new-automatic-solution-macos-v5170-or-later-}

Proxyman macOS v5.17.0 以降では、ワンクリックで Golang の HTTP/HTTPS 通信をキャプチャできます。

* ワンクリックで設定できます。HTTP プロキシの設定や、自己署名証明書の手動での信頼は不要です。
* ✅ 多くの Go ネットワークライブラリに対応しています：net/http、fasthttp、resty、gorequest、req、grequests

### 使い方： {#how-to-use}

1. Proxyman -> Setup メニュー -> Automatic Setup を開きます
2. お好みのターミナルを選択し、「Open New Terminal」ボタンをクリックします
3. 必要に応じて、AppleScript の許可ダイアログを承認します

![net/http や resty などの Golang ライブラリが一覧表示され、Open New Terminal ボタンがある Proxyman Automatic Setup ウィンドウ](https://proxyman.com/docs/assets/proxyman-automatic-setup-window.jpg)

_設定済みのターミナルを開き、Go の HTTPS 通信をインターセプトする_

4. 新しいターミナルウィンドウが開きます -> そこで Golang のバックエンドサーバーを起動するか、スクリプトを実行してください => Proxyman が通信を自動的にキャプチャします。
5. 例： 

```
$ go run main.go
```

6. Proxyman は net/http を含む Go の HTTP/HTTPS 通信をすべてキャプチャします

![go run main.go を実行しているターミナルと、net/http、fasthttp、resty からのリクエストをキャプチャした Proxyman の画面](https://proxyman.com/docs/assets/CleanShot%202025-03-18%20at%2009.56.44%402x.jpg)

_Go の net/http から HTTPS 通信をキャプチャしてインターセプト_

* Go のサンプルコード：[https://github.com/ProxymanApp/golang-example](https://github.com/ProxymanApp/golang-example)

## 2. 従来の方法（非推奨 ❌） {#2-old-solution-not-recommended-}

* Proxyman では Golang サーバーの HTTP/HTTPS 通信を一切キャプチャできません。
* 理由は、net/http などの一部のネットワークライブラリがシステムの HTTP プロキシを使用しないためです。そのため、Proxyman アプリを経由する通信は発生しません。

### 2.1 解決策 {#21-solution}

#### net/http {#nethttp}

1. プロキシを Proxyman に設定します。デフォルトでは IP = localhost、ポート 9090 です。
2. Transport が Proxyman の自己署名証明書を信頼するように設定します。設定しないと、net/http が証明書を拒否するため SSL エラーが発生します。

```go
package main

import (
	"crypto/tls"
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"net/url"
)

func main() {
	// Create a new HTTP client
	client := &http.Client{}

	// Configure the proxy
	proxyURL, err := url.Parse("http://localhost:9090")
	if err != nil {
		log.Fatal("Error parsing proxy URL:", err)
	}

	// Configure transport with proxy and TLS settings
	transport := &http.Transport{
		Proxy: http.ProxyURL(proxyURL),
		TLSClientConfig: &tls.Config{
			InsecureSkipVerify: true, // This allows self-signed certificates
		},
	}

	// Set the transport for the client
	client.Transport = transport

	// Make a request
	resp, err := client.Get("https://example.com")
	if err != nil {
		log.Fatal("Error making request:", err)
	}
	defer resp.Body.Close()

	// Read the response body
	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatal("Error reading response:", err)
	}

	// Print the response
	fmt.Printf("Status: %s\n", resp.Status)
	fmt.Printf("Body: %s\n", string(body))
}

```

## 詳細情報 {#learn-more}

* [Proxyman で Golang の HTTP/HTTPS 通信をキャプチャ](https://proxyman.com/golang)（Proxyman 公式サイト）
