Rumah  >  Artikel  >  pembangunan bahagian belakang  >  golang http permintaan tamat masa

golang http permintaan tamat masa

PHPz
PHPzasal
2023-05-10 18:03:371405semak imbas

Apabila menulis aplikasi HTTP di Golang, disebabkan ketidakstabilan persekitaran rangkaian, kami mungkin menghadapi masalah tamat masa permintaan HTTP.

Artikel ini akan memperkenalkan cara menetapkan tamat masa permintaan HTTP di Golang untuk mengelakkan penyekatan dan menunggu tanpa had.

Apakah itu tamat masa permintaan HTTP

Tamat masa permintaan HTTP bermakna pelanggan menunggu respons selepas menghantar permintaan kepada pelayan lebih daripada masa yang telah ditetapkan, menyebabkan permintaan itu dibatalkan. Keadaan ini biasanya berlaku di bawah kelewatan rangkaian, beban tinggi, sumber pelayan tidak mencukupi, dsb.

Untuk aplikasi HTTP di Golang, apabila tiada respons atau permintaan dengan masa respons yang lama, untuk mengelakkan aplikasi daripada menyekat dan menunggu selama-lamanya, kami perlu menetapkan tamat masa permintaan HTTP.

Mengapa anda perlu menetapkan tamat masa

Dalam aplikasi Golang, setiap permintaan HTTP ialah goroutine, yang akan menghantar permintaan dalam rangkaian dan menunggu respons. Jika tamat masa permintaan tidak ditetapkan, ia boleh menyebabkan atur cara menyekat dan memasuki gelung tak terhingga sementara menunggu respons, meningkatkan beban pada pelayan dan mengurangkan prestasi.

Selain itu, jika terdapat pengguna atau penyerang berniat jahat dalam aplikasi, mereka mungkin menghantar permintaan palsu untuk membuat aplikasi menunggu lama untuk mendapatkan respons, sekali gus meletihkan sumber pelayan.

Oleh itu, menetapkan tamat masa permintaan HTTP boleh memastikan bahawa terlalu banyak masa dan sumber tidak dibazirkan sebelum respons diterima, dan menghalang aplikasi daripada diserang dan kehabisan sumber.

Tetapkan tamat masa permintaan HTTP di Golang

Di Golang, kami boleh menggunakan perpustakaan net/http untuk menghantar permintaan HTTP dan menetapkan tamat masa. Jenis Pelanggan yang ditakrifkan dalam pustaka ini mempunyai sifat Tamat Masa yang membolehkan anda menetapkan tamat masa.

Berikut ialah contoh kod:

package main

import (
    "fmt"
    "net/http"
    "time"
)

func main() {
    client := http.Client{
        Timeout: time.Second * 5, // 设置超时时间为5秒
    }

    req, err := http.NewRequest(http.MethodGet, "https://www.example.com", nil)
    if err != nil {
        panic(err)
    }

    res, err := client.Do(req)
    if err != nil {
        panic(err)
    }

    fmt.Println(res)
}

Dalam kod sampel ini, kami mencipta klien HTTP dan menetapkan tamat masa kepada 5 saat. Kami kemudiannya menghantar permintaan GET ke https://www.example.com dan tunggu jawapannya. Jika permintaan tamat tempoh atau respons mengambil masa terlalu lama, ia akan tamat dalam masa 5 saat.

Cara mengendalikan ralat tamat masa

Dalam kod sampel di atas, kami menggunakan fungsi panik untuk mengendalikan ralat tamat masa permintaan HTTP. Walau bagaimanapun, dalam aplikasi sebenar, kaedah yang lebih dipercayai harus digunakan untuk mengendalikan ralat tamat masa.

Berikut ialah pendekatan yang lebih dipercayai: tambahkan Konteks pada permintaan dan gunakan penyataan pilih untuk mengendalikan tamat masa dan respons biasa:

package main

import (
    "context"
    "fmt"
    "net/http"
    "time"
)

func main() {
    client := http.Client{
        Timeout: time.Second * 5, // 设置超时时间为5秒
    }

    req, err := http.NewRequest(http.MethodGet, "https://www.example.com", nil)
    if err != nil {
        panic(err)
    }

    ctx, cancel := context.WithTimeout(req.Context(), time.Second*5)
    defer cancel() // 在函数退出时取消Context

    req = req.WithContext(ctx) // 使用带有超时的Context创建新请求

    resp, err := client.Do(req)
    if err != nil {
        select {
        case <-ctx.Done(): // 超时错误
            fmt.Println("Request timed out")
        default: // 其他错误
            panic(err)
        }
    }

    defer resp.Body.Close()
    fmt.Println(resp.StatusCode)
}

Dalam kod contoh ini, kami mencipta Konteks, Dan digunakan fungsi WithTimeout untuk menetapkan tamat masa. Kami kemudian membuat permintaan baharu menggunakan Konteks dengan tamat masa dan menghantar permintaan ini.

Jika permintaan tamat tempoh atau ralat lain berlaku, kaedah pengendalian yang berbeza akan diguna pakai berdasarkan jenis ralat yang berbeza. Ini membolehkan kami mempunyai lebih kawalan ke atas aplikasi dan mengendalikan situasi ralat dengan anggun.

Ringkasan

Apabila menulis aplikasi HTTP di Golang, untuk mengelakkan sekatan dan menunggu tanpa had, adalah sangat penting untuk menetapkan tamat masa permintaan HTTP. Kita boleh menetapkan tamat masa menggunakan jenis Klien dari perpustakaan net/http. Dan gunakan Konteks dan pilih pernyataan untuk mengendalikan ralat tamat masa dan ralat lain.

Apabila menulis aplikasi berprestasi tinggi dan stabil, anda harus menetapkan tamat masa yang sesuai berdasarkan situasi sebenar. Ini akan memastikan bahawa aplikasi masih boleh berfungsi dengan baik dalam persekitaran yang tidak terkawal.

Atas ialah kandungan terperinci golang http permintaan tamat masa. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel sebelumnya:Bagaimana kod golang berjalanArtikel seterusnya:Bagaimana kod golang berjalan