Dalam senario biasa, kami menghadapi saluran paip permintaan dan respons HTTP yang disimpan dalam fail teks. Cabaran timbul apabila kita perlu menghuraikan mesej saluran paip ini ke dalam format berstruktur untuk analisis atau pemprosesan selanjutnya. Artikel ini akan membimbing anda melalui langkah-langkah menghurai kedua-dua permintaan HTTP dan respons daripada fail teks sedemikian dalam Go.
Pustaka standard Go menyediakan fungsi yang mudah, http.ReadRequest, yang memudahkan penghuraian permintaan HTTP. Ia membaca baris permintaan, pengepala dan kandungan (jika dinyatakan oleh pengepala Content-Length) daripada *bufio.Reader.
req, err := http.ReadRequest(buf) if err != nil { return err }
Fungsi http.ReadResponse berfungsi tugas yang sama untuk respons HTTP. Ia membaca baris status, pengepala dan kandungan daripada *bufio.Reader.
resp, err := http.ReadResponse(buf, req) if err != nil { return err }
Fungsi http.ReadResponse secara automatik menutup badan respons apabila kembali. Untuk mengekalkan badan untuk kegunaan kemudian, kita perlu menyalinnya secara manual ke dalam penimbal lain.
b := new(bytes.Buffer) io.Copy(b, resp.Body) resp.Body.Close() resp.Body = ioutil.NopCloser(b)
Untuk menghuraikan saluran paip HTTP daripada fail, kami menggunakan pakej bufio untuk membaca fail baris demi baris dan mencipta sekeping struct Sambungan untuk menyimpan permintaan yang dihuraikan dan respons.
stream := make([]Connection, 0) for { req, err := http.ReadRequest(buf) if err == io.EOF { break } resp, err := http.ReadResponse(buf, req) if err != nil { return err } ... stream = append(stream, Connection{Request: req, Response: resp}) }
Untuk tujuan pengesahan, kami boleh menggunakan httputil.DumpRequest dan httputil.DumpResponse untuk membuang permintaan dan respons yang dihuraikan ke dalam rentetan untuk pemeriksaan.
b, err := httputil.DumpRequest(c.Request, true) if err != nil { log.Fatal(err) } fmt.Println(string(b)) b, err = httputil.DumpResponse(c.Response, true) if err != nil { log.Fatal(err) } fmt.Println(string(b))
Dengan memanfaatkan http.ReadRequest dan http.ReadResponse berfungsi bersama-sama dengan pengendalian badan yang teliti, kami boleh menghuraikan permintaan saluran paip HTTP dan respons daripada fail teks dalam Go dengan berkesan. Pendekatan ini membolehkan kami menganalisis, memproses atau menguji senario komunikasi HTTP dengan cara yang mudah dan boleh dipercayai.
Atas ialah kandungan terperinci Bagaimana untuk Menghuraikan Permintaan dan Respons HTTP Berpaip daripada Fail Teks dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!