ホームページ  >  記事  >  バックエンド開発  >  golang で http.request.body を再利用する方法

golang で http.request.body を再利用する方法

藏色散人
藏色散人転載
2020-10-20 13:58:112795ブラウズ

次のコラム golang チュートリアル では、golang で http.request.body を再利用する方法の例を紹介します。

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 サイトの他の関連記事を参照してください。

声明:
この記事はjb51.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。