>백엔드 개발 >Golang >golang 요청 시간 초과

golang 요청 시간 초과

PHPz
PHPz원래의
2023-05-27 11:37:08904검색

웹 애플리케이션을 개발할 때 원격 서비스에서 데이터를 얻기 위해 네트워크 요청을 해야 하는 경우가 많습니다. 그러나 때때로 네트워크 요청은 느린 네트워크, 네트워크 오류 또는 대상 서버의 느린 응답과 같은 다양한 문제로 인해 영향을 받을 수 있습니다. 이 경우 요청을 중지하고, 필요한 경우 재처리하거나 실패를 통보할 수 있도록 보다 정확한 제어 및 관리가 필요합니다.

Go는 네트워크 프로그래밍을 위한 다양한 내장 네트워킹 기능을 제공하는 강력한 프로그래밍 언어입니다. Go의 표준 라이브러리는 HTTP 클라이언트 요청 기능을 포함하여 웹 개발을 위한 많은 기능을 제공하는 net/http 패키지를 제공합니다. 이 기사에서는 Go에서 HTTP 클라이언트 요청의 시간 초과를 처리하는 방법을 다룹니다.

타임아웃 처리란 설정된 시간 내에 요청에 응답할 수 없는 경우 강제로 중지되고 오류가 반환된다는 의미입니다. 대부분의 경우 요청에 시간이 너무 오래 걸리면 대상 서비스에 문제가 있거나 네트워크 연결이 실패했음을 나타낼 수 있으므로 시간 초과 처리를 통해 네트워크 요청을 더 안전하고 안정적으로 만들 수 있습니다.

Go에서 요청 시간 초과 처리를 구현하는 것은 매우 쉽습니다. 요청 타임아웃 기능을 쉽게 구현하려면 요청을 시작할 때 타임아웃을 추가하고 관련 오류를 캡처하기만 하면 됩니다. 아래에서는 Go를 사용하여 일부 일반적인 HTTP 클라이언트 요청에 대한 시간 초과 처리를 구현하는 방법을 소개합니다.

  1. GET 요청 시간 초과 처리

Go에서는 http.Get() 메서드를 사용하여 GET 요청을 시작할 수 있습니다. 요청할 때 컨텍스트를 설정하고 시간 초과를 설정할 수 있습니다. 시간 초과 내에 응답이 수신되지 않으면 시간 초과 처리가 트리거됩니다. 예는 다음과 같습니다.

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)
}

이 예에서는 먼저 http.Client 객체를 생성하고 Timeout 속성을 1초로 설정합니다. 즉, 1초 내에 응답이 없으면 시간 초과로 간주됩니다. 그런 다음 컨텍스트 패키지를 사용하여 컨텍스트를 생성하고 지연을 5초로 설정합니다. 다음으로, http.NewRequestWithContext() 메소드를 사용하여 GET 요청을 생성하고 컨텍스트를 메소드에 전달합니다. 마지막으로 http.Client 개체를 사용하여 요청합니다. 요청 시간이 초과되거나 다른 오류가 발생하면 해당 오류 메시지가 생성됩니다.

  1. POST 요청 시간 초과 처리

GET 요청과 달리 POST 요청은 요청 본문에 데이터를 전달해야 합니다. Go에서는 http.Post() 메서드를 사용하여 POST 요청을 시작할 수 있습니다. 마찬가지로 지정된 시간 내에 요청이 응답되도록 컨텍스트와 시간 제한을 설정할 수 있습니다. 예는 다음과 같습니다.

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)
}

이 예에서는 요청 본문이 JSON 형식의 데이터인 POST 요청을 생성합니다. bytes 패키지를 사용하여 JSON 데이터를 바이트 스트림으로 변환하고 이를 요청 본문으로 http.NewRequestWithContext() 메서드에 전달합니다. 나머지는 GET 요청과 동일하게 처리됩니다.

  1. 클라이언트 측 사용자 지정 시간 초과

실제 애플리케이션에서는 다양한 요청 상황에 따라 시간 초과를 설정해야 합니다. 예를 들어, 일부 API는 응답 시간이 매우 빠르므로 더 짧은 시간 제한을 설정해야 하는 반면, 일부 API는 응답 시간이 길어서 더 긴 시간 제한을 설정해야 합니다. Go에서는 컨텍스트 패키지와 시간 패키지를 사용하여 시간 제한을 맞춤설정할 수 있습니다. 예는 다음과 같습니다.

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)
}

이 예에서는 먼저 http.Client 개체를 생성하고 Timeout 속성을 설정하지 않습니다. 다음으로, context 패키지를 사용하여 컨텍스트를 생성하고 시간 초과를 5초로 설정합니다. 그런 다음 http.NewRequestWithContext() 메서드를 사용하여 GET 요청을 생성하고 컨텍스트를 메서드에 전달합니다. 다음으로 시간 제한을 3초로 맞춤 설정하고 http.Client 개체를 사용하여 요청을 시작합니다. 요청 시간이 초과되면 3초 후에 오류 메시지가 반환되고 컨텍스트의 시간은 기다리지 않습니다.

요약

Go에서는 네트워크 요청에 대한 시간 초과 처리가 매우 간단합니다. 요청 시 컨텍스트와 시간 초과만 설정하면 됩니다. 요청이 합리적인 시간 내에 완료되도록 필요에 따라 시간 초과를 사용자 정의할 수 있습니다. 요청 시간 초과 처리는 네트워크 프로그래밍의 매우 중요한 부분으로, 시스템의 신뢰성과 안정성을 보장하고 불필요한 대기와 리소스 낭비를 방지할 수 있습니다. 실제 개발에서는 시스템 성능과 효율성을 향상시키기 위해 다양한 시나리오와 비즈니스 요구에 따라 타임아웃 처리 및 기타 네트워크 기능을 유연하게 사용해야 합니다.

위 내용은 golang 요청 시간 초과의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
이전 기사:golang sqlite 설치다음 기사:golang sqlite 설치