Apabila membangunkan aplikasi web, selalunya perlu membuat permintaan rangkaian untuk mendapatkan data daripada perkhidmatan jauh. Walau bagaimanapun, kadangkala permintaan rangkaian mungkin dipengaruhi oleh pelbagai isu, seperti rangkaian yang perlahan, kegagalan rangkaian atau tindak balas yang perlahan daripada pelayan sasaran. Dalam kes ini, kami memerlukan kawalan dan pengurusan permintaan yang lebih tepat untuk menghentikan permintaan dan memprosesnya semula atau memaklumkan kegagalan apabila perlu.
Go ialah bahasa pengaturcaraan berkuasa yang menyediakan banyak ciri rangkaian terbina dalam untuk pengaturcaraan rangkaian. Pustaka standard Go menyediakan pakej net/http, yang menyediakan banyak ciri untuk pembangunan web, termasuk fungsi permintaan klien HTTP. Dalam artikel ini, kami akan membincangkan cara mengendalikan tamat masa dengan permintaan klien HTTP dalam Go.
Pemprosesan tamat masa bermakna jika permintaan tidak dapat dijawab dalam masa yang ditetapkan, permintaan itu akan dihentikan secara paksa dan ralat akan dikembalikan. Dalam kebanyakan kes, jika permintaan mengambil masa terlalu lama, ia mungkin menunjukkan masalah dengan perkhidmatan sasaran atau kegagalan sambungan rangkaian, jadi pengendalian tamat masa boleh menjadikan permintaan rangkaian lebih selamat dan lebih stabil.
Sangat mudah untuk melaksanakan pengendalian tamat masa permintaan dalam Go. Kami hanya perlu menambah tamat masa apabila memulakan permintaan dan menangkap ralat berkaitan untuk melaksanakan fungsi tamat masa permintaan dengan mudah. Di bawah ini kami akan memperkenalkan cara menggunakan Go untuk melaksanakan pemprosesan tamat masa untuk beberapa permintaan klien HTTP biasa.
Dalam Go, kami boleh menggunakan kaedah http.Get() untuk memulakan permintaan GET. Apabila membuat permintaan, kami boleh menetapkan konteks dan menetapkan tamat masa Jika tiada respons diterima dalam tamat masa, pemprosesan tamat masa akan dicetuskan. Berikut ialah contoh:
package main import ( "context" "fmt" "net/http" "time" ) func main() { client := http.Client{ Timeout: time.Duration(1) * time.Second, } ctx, cancel := context.WithTimeout(context.Background(), time.Duration(5)*time.Second) defer cancel() req, err := http.NewRequestWithContext(ctx, http.MethodGet, "http://example.com", nil) if err != nil { fmt.Println(err) return } res, err := client.Do(req) if err != nil { fmt.Println(err) return } fmt.Println("response Status:", res.Status) }
Dalam contoh ini, kami mula-mula mencipta objek http.Client dan menetapkan sifat Tamat Masa kepada 1 saat, yang bermaksud bahawa jika tiada respons dalam masa satu saat, ia akan dianggap sebagai tamat masa. Kami kemudian mencipta konteks menggunakan pakej konteks dan menetapkan kelewatan kepada 5 saat. Seterusnya, kami mencipta permintaan GET menggunakan kaedah http.NewRequestWithContext() dan lulus konteks kepada kaedah tersebut. Akhir sekali, kami menggunakan objek http.Client untuk membuat permintaan. Jika permintaan tamat masa atau ralat lain berlaku, mesej ralat yang sesuai akan dihasilkan.
Tidak seperti permintaan GET, permintaan POST perlu menghantar data dalam badan permintaan. Dalam Go, kita boleh menggunakan kaedah http.Post() untuk memulakan permintaan POST. Begitu juga, kami boleh menetapkan konteks dan tamat masa untuk memastikan permintaan itu dijawab dalam masa yang ditentukan. Berikut ialah contoh:
package main import ( "bytes" "context" "fmt" "net/http" "time" ) func main() { client := http.Client{ Timeout: time.Duration(1) * time.Second, } ctx, cancel := context.WithTimeout(context.Background(), time.Duration(5)*time.Second) defer cancel() requestBody := []byte(`{"id":1,"name":"John"}`) req, err := http.NewRequestWithContext(ctx, http.MethodPost, "http://example.com", bytes.NewBuffer(requestBody)) if err != nil { fmt.Println(err) return } res, err := client.Do(req) if err != nil { fmt.Println(err) return } fmt.Println("response Status:", res.Status) }
Dalam contoh ini, kami membuat permintaan POST dengan badan permintaan sebagai data dalam format JSON. Kami menggunakan pakej bait untuk menukar data JSON kepada strim bait dan menghantarnya sebagai badan permintaan kepada kaedah http.NewRequestWithContext(). Selebihnya dikendalikan sama seperti permintaan GET.
Dalam aplikasi sebenar, kami perlu menetapkan tamat masa berdasarkan situasi permintaan yang berbeza. Contohnya, sesetengah API mempunyai masa respons yang sangat pantas dan kami perlu menetapkan tamat masa yang lebih pendek, manakala sesetengah API mempunyai masa respons yang lebih lama dan kami perlu menetapkan tamat masa yang lebih lama. Dalam Go, kita boleh menggunakan pakej konteks dan pakej masa untuk menyesuaikan tamat masa. Berikut ialah contoh:
package main import ( "context" "fmt" "net/http" "time" ) func main() { client := http.Client{} ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() req, err := http.NewRequestWithContext(ctx, http.MethodGet, "http://example.com", nil) if err != nil { fmt.Println(err) return } // 自定义超时时间 timeout := time.Duration(3) * time.Second // 发起请求 res, err := client.Do(req) if err != nil { fmt.Println(err) return } fmt.Println("response Status:", res.Status) }
Dalam contoh ini, kami mula-mula mencipta objek http.Client dan tidak menetapkan sifat Tamat Masa. Seterusnya, kami mencipta konteks menggunakan pakej konteks dan menetapkan tamat masa kepada 5 saat. Kami kemudian membuat permintaan GET menggunakan kaedah http.NewRequestWithContext() dan lulus konteks kepada kaedah tersebut. Seterusnya, kami menyesuaikan tamat masa selama 3 saat dan menggunakan objek http.Client untuk memulakan permintaan. Jika permintaan tamat, mesej ralat akan dikembalikan selepas 3 saat dan masa dalam konteks tidak akan menunggu.
Ringkasan
Dalam Go, pemprosesan tamat masa untuk permintaan rangkaian adalah sangat mudah Anda hanya perlu menetapkan konteks dan menetapkan tamat masa apabila membuat permintaan. Kami boleh menyesuaikan tamat masa mengikut keperluan untuk memastikan permintaan diselesaikan dalam masa yang munasabah. Permintaan pemprosesan tamat masa adalah bahagian yang sangat penting dalam pengaturcaraan rangkaian, yang boleh memastikan kebolehpercayaan dan kestabilan sistem dan mengelakkan menunggu yang tidak perlu dan pembaziran sumber. Dalam pembangunan sebenar, kita harus menggunakan pemprosesan tamat masa dan fungsi rangkaian lain secara fleksibel mengikut senario dan keperluan perniagaan yang berbeza untuk meningkatkan prestasi dan kecekapan sistem.
Atas ialah kandungan terperinci permintaan golang tamat masa. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!