HTTPプロトコルはTCP / IPプロトコルスタックに基づいているため、net.Dial
or net.DialTimeout
関数を介して HTTPプロトコルに基づいてネットワークサービスにアクセスすることはまったく問題ありません。しかしnet.Dial
、HTTPプログラミング機能、HTTPステータスコード、パケットヘッダー処理セクション、およびエンティティを介して詳細を確認するのが非常に面倒な場合、問題は簡単ではありません (HTTPプロトコルネットワークプロトコルについては、アプリケーション層プロトコルで学ぶことができます)そのため、Go言語標準ライブラリには、 HTTPクライアントおよびサーバーの特定の実装をカバーする組み込みの net / httpパッケージがあります。このnet/http
パッケージを通じて、 HTTPクライアントおよびサーバープログラムをより便利かつ迅速に作成できます。
まず、HTTPクライアントプログラミングを見てみましょう。
http.Client
ネット/ HTTP パッケージは、最も簡潔なHTTPクライアントの実装を提供し、あなたが直接、最も一般的に使用することができます GET
し、 POST
HTTP要求を開始する方法を。
具体的には 、net/http
パッケージClient
内のクラスによって提供される次のメソッドを介してHTTPリクエストを開始でき ます 。
func (c *Client) Do(req *Request) (*Response, error)
func (c *Client) Get(url string) (resp *Response, err error)
func (c *Client) Head(url string) (resp *Response, err error)
func (c *Client) Post(url, contentType string, body io.Reader) (resp *Response, err error)
func (c *Client) PostForm(url string, data url.Values) (resp *Response, err error)
以下は、これらの方法の使用法の簡単な紹介です。
http.Get
サンプルコード
GETリクエストを開始するには、http.Get()
メソッドを呼び出してリクエストURLを渡すだけ です。サンプルコードは次のとおりです。
resp, err := http.Get("https://www.csdn.net/")
if err != nil {
fmt.Printf("发起请求失败:%v", err)
return
}
defer resp.Body.Close()
io.Copy(os.Stdout, resp.Body)
上記のコードは、CSDNホームページへのリクエストを開始し、そのWebコンテンツを標準出力ストリームに出力するために使用されます。
ボトムコール
実際 http.Get
、リクエストが開始されるとhttp.Client
、上記のデフォルトオブジェクトのGet
メソッドがデフォルトで呼び出され ます 。
func Get(url string) (resp *Response, err error) {
return DefaultClient.Get(url)
}
そして、 DefaultClient
デフォルトのポイントは http.Client
オブジェクトインスタンスです。
var DefaultClient = &Client{}
これは、ある net/http
ときに我々は、開示されたパッケージのプロパティ http
呼び出しで Get
、Post
、PostForm
、Head
方法、最終的に対応するメソッドがオブジェクトで呼び出されます。
戻り値
http.Get()
メソッド自体に戻ると、 メソッドは2つの値を返します。最初の値は応答オブジェクトで、2番目の値は error
オブジェクトです。要求プロセス中にエラーが発生した場合、 error
オブジェクトは空ではありません。それ以外の場合、ステータスコードと応答は次のようになります。応答オブジェクトヘッダー、応答エンティティ、およびその他の情報を通じて取得されます。応答オブジェクトはクラスに属し ます。APIドキュメントまたはソースコードをhttp.Response
確認して 、タイプの特定の情報を理解でき ます。通常、 応答エンティティを 取得し、応答ヘッダー、および 応答ステータスコードを 取得します。resp.Body
resp.Header
resp.StatusCode
応答を正常に取得したら、resp.Body
上記の Close
メソッドを呼び出して、リソースを解放するためのネットワーク要求を終了することを忘れないで ください。
http.Post
POSTでデータを送信するのも非常に簡単です。http.Post()
メソッドを呼び出して、次の3つのパラメーターを順番に渡すだけ です。
- リクエストターゲットのURL
- POSTリクエストデータのリソースタイプ(MIMEType)
- データビットストリーム(
[]byte
フォーム)
次のサンプルコードは、ユーザーアバターをアップロードする方法を示しています。
resp, err := http.Post("https://xueyuanjun.com/avatar", "image/jpeg", &imageDataBuf)
if err != nil {
// 处理错误
return
}
if resp.StatusCode != http.StatusOK {
// 处理错误
return
}
// ...
基礎となる実装と戻り値は http.Get
同じです。
http.PostForm
http.PostForm()
このメソッドは、application/x-www-form-urlencoded
POSTフォームの送信を標準のエンコード形式で実装します 。
次のサンプルコードは、HTMLログインフォームの送信をシミュレートします。
resp, err := http.PostForm("https://xueyuanjun.com/login", url.Values{"name":{"学院君"}, "password": {"test-passwd"}})
if err != nil {
// 处理错误
return
}
if resp.StatusCode != http.StatusOK {
// 处理错误
return
}
// ...
POSTリクエストパラメータは、url.Values
メソッドによってエンコードおよびカプセル化する必要があることに注意してください 。
基礎となる実装と戻り値は http.Get
同じです。
http.Head
HTTPヘッド要求は、ターゲットURLの応答ヘッダー情報のみが要求され、応答エンティティが返されないことを意味します。http.Head()
メソッドhttp.Get()
と同じメソッドを介してHeadリクエストを開始 でき ますが、ターゲットURLパラメーターを渡すだけです。
次のサンプルコードは、CSDNホームページのHTTP応答ヘッダー情報を要求するために使用されます。
resp, err := http.Head("https://www.csdn.net/")
if err != nil {
fmt.Println("Request Failed: ", err.Error())
return
}
defer resp.Body.Close()
// 打印头信息
for key, value := range resp.Header {
fmt.Println(key, ":", value)
}
http.Head()
メソッドによって返される 応答エンティティ resp.Body
値は空です。
基礎となる実装と戻り値は http.Get
同じです。
(* http.Client).Do
最後 に、http.Client
クラスの Do
メソッドを見てみましょう 。
ほとんどの場合http.Get
、http.Post
そして http.PostForm
需要を満たすためですが、HTTPリクエストを開始して、次のようなカスタムリクエストヘッダーを設定する必要がある場合。
User-Agent
デフォルトではなく、カスタムを設定 しますGo http package
。- Cookie情報を渡します。
- HTTPは、次のような、他の手段によって開始されたリクエスト
PUT
、PATCH
、DELETE
などが挙げられます。
この時点で、http.Client
クラスによって提供さ れるDo()
メソッドによって実現できます 。このメソッドを使用すると、 クラス内のメソッドはデフォルトDefaultClient
オブジェクト を介して呼び出されなくなり http.Client
ますが、Client
オブジェクトを手動でインスタンス化し、渡してカスタムリクエストを追加する必要があります。 ヘッダー情報HTTP要求を開始するための要求オブジェクト:
// 初始化客户端请求对象
req, err := http.NewRequest("GET", "https://xueyuanjun.com", nil)
if err != nil {
fmt.Printf("请求初始化失败:%v", err)
return
}
// 添加自定义请求头
req.Header.Add("Custom-Header", "Custom-Value")
// ... 其它请求头配置
client := &http.Client{
// ... 设置客户端属性
}
resp, err := client.Do(req)
if err != nil {
fmt.Printf("客户端发起请求失败:%v", err)
return
}
defer resp.Body.Close()
io.Copy(os.Stdout, resp.Body)
リクエストオブジェクトの初期化に使用するhttp.NewRequest
メソッドは、3つのパラメータを渡す必要があります 。1つ目はリクエストメソッド、2つ目はターゲットURL、3つ目はリクエストエンティティです。設定する必要があるのは、POST、PUT、DELETEなどのリクエストのみです。リクエストエンティティ。HEADとGETの場合は、を渡すだけ nil
です。
http.NewRequest
メソッドによって返される最初の値はreq
、クラスに属する リクエストオブジェクトインスタンス http.Request
です。このクラスのパブリックメソッドと属性を呼び出して、リクエストメソッド、URL、リクエストヘッダーなどのリクエストオブジェクトをカスタマイズできます。
設定が完了したら、リクエストオブジェクトをclient.Do()
メソッドに渡して HTTPリクエストを開始できます。以降の操作は、前の4つの基本的なメソッドと同じです。
Cookieの設定方法、ファイルのアップロードとダウンロードの方法、要求/応答のタイムアウトの処理方法など、使用法の詳細については、以降のチュートリアルで個別に紹介します。これらの基本的なHTTP要求の使用方法について簡単に説明します。メソッド。