Go HTTPプログラミング(1):クライアントはどのようにHTTP要求を開始しますか

 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 呼び出しで GetPostPostFormHead 方法、最終的に対応するメソッドがオブジェクトで呼び出されます。

戻り値

http.Get() メソッド自体に戻ると、 メソッドは2つの値を返します。最初の値は応答オブジェクトで、2番目の値は error オブジェクトです。要求プロセス中にエラーが発生した場合、 error オブジェクトは空ではありません。それ以外の場合、ステータスコードと応答は次のようになります。応答オブジェクトヘッダー、応答エンティティ、およびその他の情報を通じて取得されます。応答オブジェクトはクラスに属し ます。APIドキュメントまたはソースコードをhttp.Response確認して 、タイプの特定の情報を理解でき ます。通常、 応答エンティティを  取得し、応答ヘッダー、および 応答ステータスコードを 取得します。resp.Bodyresp.Headerresp.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.Gethttp.Post そして http.PostForm 需要を満たすためですが、HTTPリクエストを開始して、次のようなカスタムリクエストヘッダーを設定する必要がある場合。

  • User-Agentデフォルトではなく、カスタムを設定 します Go http package
  • Cookie情報を渡します。
  • HTTPは、次のような、他の手段によって開始されたリクエスト PUTPATCHDELETE などが挙げられます。

この時点で、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要求の使用方法について簡単に説明します。メソッド。

おすすめ

転載: blog.csdn.net/wxy_csdn_world/article/details/107442694