次のコラム golang チュートリアル では、golang で http.request.body を再利用する方法の例を紹介します。
#問題とシナリオ
http.request.body を配布する必要があるビジネスシーンで。たとえば、WeChat コールバック メッセージではアドレスを 1 つしか指定できないため、メッセージのコピーを他のサービスに送信できることが期待されます。 WeChat コールバックを受信するサービス B とサービス A は、WeChat コールバック情報を一緒に処理します。
この記事では、golang による http.request.body の再利用に関する関連内容を詳細に紹介し、皆さんの参照と学習のために共有します。以下では多くを述べませんので、詳細な紹介を見てみましょう
解決策
最初に考慮すべきことは、http.request を直接転送することです。 ReverseProxy を使用して、http.request をサービス A からサービス B に直接転送します。しかし、WeChatは検証などの問題があり、完全に調整するのは非常に面倒です。そこで考えを変え、http.request.bodyの内容をサービスBに直接投稿することにしました。
ただし、http.request は readcloser です。 readAll http.request では、http.request 内の情報を再度読み取ることはできません。
http.request.body をコピーして使用するにはどうすればよいですか?
ここで、 c は http
// 把request的内容读取出来
var bodyBytes []byte
if c.Request.Body != nil {
bodyBytes, _ = ioutil.ReadAll(c.Request.Body)
}
// 把刚刚读出来的再写进去
c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(bodyBytes))
ログイン後にコピー
1 のコンテキストを表します。まず http.request から本文を読み取り、それを変数に保存します。
2. 次に、ioutil.NopCloser メソッドを使用して、変数内のデータを http.request に書き込みます。
https://golang.org/pkg/io/ioutil/#NopCloser
NopCloser returns a ReadCloser with a no-op Close method wrapping the provided Reader r.
ログイン後にコピー
NopCloser は、Reader r を操作のない Close メソッドでラップし、ReadCloser インターフェイスを返します。
これで、処理に再び c.request を使用できるようになります。
以上がgolang で http.request.body を再利用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。