golang は http リクエストを受け入れます

王林
リリース: 2023-05-15 11:17:07
オリジナル
1512 人が閲覧しました

Golang は、幅広い用途に使用できる効率的で簡潔なプログラミング言語です。 Web 開発に関しては、Golang の高い効率性、同時実行性などの強力な機能により、Golang は Web 開発で人気のテクノロジーの 1 つとなっています。この記事では、Golang を使用して HTTP リクエストを受信する方法を分析します。

1. HTTP リクエストとレスポンス

Golang による HTTP リクエストの受け入れを理解する前に、まず HTTP リクエストとレスポンスの基本概念を理解しましょう。

HTTP リクエストは、クライアントからサーバーに送信されるリクエスト操作を指します。これは次の部分に分かれています:

  • リクエスト行: HTTP メソッド、URL、HTTP バージョンが含まれます
  • リクエスト ヘッダー: クライアント情報、認証情報など、要求される追加情報。
  • リクエスト本文: リクエストによって伝送されるデータ。

HTTP 応答は、クライアントが発行した HTTP 要求に対してサーバーが作成した応答を指し、次の部分に分かれています。

  • 応答行: HTTP が含まれます。バージョン、ステータスコード、ステータスの説明。
  • レスポンス ヘッダー: サーバー情報、有効期限などのレスポンスの追加情報。
  • 応答本文: 応答の内容。

2. Golang を使用して HTTP リクエストを処理する

Golang では、net/http ライブラリを使用して HTTP リクエストを簡単に処理できます。このライブラリは、要求された URL に基づいて要求を動的にルーティングするデフォルトの HTTP ルーターを提供します。

以下は、Golang を使用して HTTP リクエストを受信する方法を示す簡単な例です。

package main

import (
    "fmt"
    "net/http"
)

func main() {
    http.HandleFunc("/", hello)
    http.ListenAndServe(":8080", nil)
}

func hello(w http.ResponseWriter, r *http.Request) {
    fmt.Println("Hello world")
    fmt.Fprintf(w, "Hello, %s!", r.URL.Path[1:])
}
ログイン後にコピー

この例は、Golang で http.HandleFunc 関数を使用して、 HTTP リクエストを処理します。この関数は 2 つのパラメータを受け取ります:

  • リクエストされた URL パス
  • リクエストを処理するメソッド (つまり、リクエスト コールバック関数)

Inこの例では、hello 関数を呼び出してすべてのリクエストを処理させます。この関数は「Hello world」を出力し、「Hello, {path}!」という内容の応答を返します。ここで、{path} は要求されたパスです。

http.ListenAndServe 関数を使用して HTTP サーバーを起動し、ポート 8080 で待機します。 2 番目のパラメータにはサーバーのルーターが渡されますが、ここで渡すのは nil で、これはデフォルトのルーターが使用されることを意味します。

3. HTTP リクエストを処理するための具体的な手順

上記の例は、Golang を使用して HTTP リクエストを受信して​​処理する方法を示しています。では、具体的な処理手順を詳しく説明していきます。

  1. ルーターの作成

http.NewServeMux 関数を使用して、新しいルーターを作成できます。この関数は、HTTP リクエストの処理に使用できる http.Handler インターフェイスを実装する新しい ServeMux タイプのオブジェクトを返します。

mux := http.NewServeMux()
ログイン後にコピー
  1. ハンドラー関数の登録

http.HandleFunc 関数を使用して、ハンドラー関数を登録できます。この関数の最初のパラメータはリクエストのパスで、2 番目のパラメータはリクエストを処理する関数です。

mux.HandleFunc("/", handleRequest)
ログイン後にコピー
  1. HTTP サーバーの開始

http.ListenAndServe 関数を使用して、HTTP サーバーを開始します。最初のパラメータはサーバーのアドレス、2 番目のパラメータはルーターです。

http.ListenAndServe(":8080", mux)
ログイン後にコピー
  1. リクエストの処理

HTTP リクエストを受信すると、ルーターはリクエスト パスに基づいて対応する処理機能を自動的に選択し、そこにリクエストを渡します。処理関数は 2 つのパラメータを受け取る必要があります:

  • http.ResponseWriter: HTTP 応答の書き込みに使用されるインターフェイス
  • *http.Request: リクエストのすべての情報が含まれます
func handleRequest(w http.ResponseWriter, r *http.Request) {
    // 处理请求
}
ログイン後にコピー

処理関数では、要求されたデータの読み取り、応答の生成などを行うことができます。

4. 一般的に使用される HTTP メソッド

HTTP リクエスト メソッドは、リソースに対して実行される操作を指します。一般的に使用される HTTP メソッドは次のとおりです。

  • GET: リソースの取得
  • POST: 新しいリソースの作成
  • PUT: リソースの更新または作成
  • DELETE:リソースの削除

Golang では、http.Method 定数を使用してさまざまな HTTP メソッドを表すことができます。

r.Method == http.MethodGet
r.Method == http.MethodPost
r.Method == http.MethodPut
r.Method == http.MethodDelete
ログイン後にコピー

5. リクエスト パラメータの取得

HTTP リクエストの処理プロセス中に、リクエスト内のパラメータを取得する必要がある場合があります。これには、URL クエリ パラメーター、POST リクエストのフォーム データなどが含まれます。 Golang では、次の方法でリクエスト パラメータを取得できます。

  • URL クエリ パラメータ: r.URL.Query() 関数を使用して、URL クエリ パラメータ ディクショナリを取得します。
  • POST リクエストのフォーム データ: r.PostFormValue() 関数を使用して、POST リクエストのフォーム データを取得します。
  • リクエスト ヘッダー: r.Header を使用してリクエスト ヘッダーを取得します。

次に、リクエスト パラメータを取得する例を示します。

func handleRequest(w http.ResponseWriter, r *http.Request) {
    // 获取URL查询参数
    queryParams := r.URL.Query()
    name := queryParams.Get("name")
    fmt.Println("Name: ", name)

    // 获取POST表单参数
    err := r.ParseForm()
    if err != nil {
        http.Error(w, "Bad Request", http.StatusBadRequest)
        return
    }
    username := r.PostFormValue("username")
    password := r.PostFormValue("password")
    fmt.Println("Username: ", username)
    fmt.Println("Password: ", password)

    // 获取请求头
    userAgent := r.Header.Get("User-Agent")
    fmt.Println("User-Agent: ", userAgent)
}
ログイン後にコピー

この例では、URL クエリ パラメータ、POST フォーム パラメータ、およびリクエスト ヘッダーを取得する方法を示します。 r.URL.Query() を使用して URL クエリ パラメーター ディクショナリを取得し、r.PostFormValue() を使用して POST フォーム パラメーターを取得し、r.Header.Get ( ) リクエストヘッダーを取得します。

6. HTTP レスポンスの処理

HTTP リクエストの処理プロセス中に、クライアントにレスポンスを返す必要もあります。 Golang では、http.ResponseWriter インターフェイスを使用して HTTP 応答を作成できます。このインターフェイスは次のメソッドを提供します:

  • Write:将字节数组写入响应体
  • WriteString:将字符串写入响应体
  • Header:获取响应头,可以通过它来设置响应头
  • WriteHeader:设置响应状态码

下面是一个返回HTTP响应的例子:

func handleRequest(w http.ResponseWriter, r *http.Request) {
    // 写入响应体
    w.Write([]byte("Hello world"))

    // 设置响应头
    w.Header().Set("Content-Type", "text/plain")

    // 设置响应状态码
    w.WriteHeader(http.StatusOK)
}
ログイン後にコピー

这个例子展示了如何返回HTTP响应。我们使用w.Write函数将字节数组写入响应体,使用w.Header.Set函数设置响应头,使用w.WriteHeader函数设置响应状态码。

七、中间件

中间件是一种常见的 Web 开发模式。在处理 HTTP 请求的过程中,我们可以使用中间件来增强 HTTP 处理功能和业务逻辑。例如,Golang 中的 gin 框架就是一个很好的中间件实现。

在 Golang 中,我们可以轻松地定义自己的中间件。中间件函数可以接收一个 http.HandlerFunc 类型的参数,并返回一个 http.HandlerFunc 类型的函数。在中间件函数中,我们可以对请求进行一些检查或者增加一些业务逻辑,例如鉴权、日志记录等等。

下面是一个简单的中间件例子:

func middleware(next http.HandlerFunc) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        // 鉴权逻辑...
        if isAuthenticate(r) {
            next(w, r)
        } else {
            http.Error(w, "Unauthorized", http.StatusUnauthorized)
        }
    }
}
ログイン後にコピー

在这个例子中,我们定义了一个名为 middleware 的中间件函数。它的参数是一个 http.HandlerFunc 类型的函数。在中间件函数中,我们可以进行鉴权等逻辑,然后决定是否调用 next 函数,继续处理请求。

在我们的应用中,我们可以使用上述定义的中间件函数,并将处理函数传递给它。

func hanldeRequest(w http.ResponseWriter, r *http.Request) {
    // 处理代码...
}

http.HandleFunc("/", middleware(handleRequest))
ログイン後にコピー

在这个例子中,我们使用 http.HandleFunc 函数来将处理函数和路由路径绑定在一起。然后,我们将它作为参数传递给 middleware 函数,再将返回的 http.HandlerFunc 类型的函数作为参数传递给 http.HandleFunc 函数。

总结

在本文中,我们介绍了如何使用 Golang 来接收 HTTP 请求。我们了解了 HTTP 请求和响应的基本概念,在实践中使用 net/http 库来处理 HTTP 请求,并详细介绍了具体的处理步骤和常用的 HTTP 方法。同时,我们还探讨了中间件的概念和实现方式。

如果你对 Golang 的 Web 开发有兴趣,这些内容对你来说应该是非常有帮助的。最后,我希望本文可以让你更好地理解 Golang 接受 HTTP 请求的知识。

以上がgolang は http リクエストを受け入れますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート