2026년 상식닷컴 선정 식당 & 카페 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요

Go에서 HTTP 요청을 보내는 방법은 무엇인가요?

_____
Q: Go에서 HTTP 요청을 보내는 가장 기본적인 방법은 무엇인가요?
A: Go 표준 라이브러리의 `net/http` 패키지를 사용하여 `http.Get` 함수로 간단한 GET 요청을 보낼 수 있습니다. 예:
```go
resp, err := http.Get("https://example.com")
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
// 응답 처리
```

Q: Go에서 HTTP POST 요청을 보내는 방법은?
A: `http.Post` 함수를 사용해 POST 요청을 쉽게 보낼 수 있습니다. 예:
```go
resp, err := http.Post("https://example.com/api", "application/json", strings.NewReader(`{"key":"value"}`))
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
// 응답 처리
```

Q: 더 세밀한 HTTP 요청 설정이 필요할 때는 어떻게 하나요?
A: `http.NewRequest` 함수로 요청 객체를 만들고 `http.Client`의 `Do` 메서드로 보냅니다. 예:
```go
client := &http.Client{}
req, err := http.NewRequest("POST", "https://example.com/api", strings.NewReader("param=value"))
if err != nil {
log.Fatal(err)
}
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
resp, err := client.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
// 응답 처리
```

Q: 요청 헤더를 추가하려면 어떻게 해야 하나요?
A: `http.Request` 객체의 `Header` 필드를 사용해 헤더를 설정합니다.
예: `req.Header.Set("Authorization", "Bearer token")`

Q: HTTP 요청에 쿼리 파라미터를 추가하는 방법은?
A: URL에 쿼리 파라미터를 직접 추가하거나 `url.Values`를 활용해 만듭니다.
예:
```go
u, _ := url.Parse("https://example.com/search")
q := u.Query()
q.Set("q", "golang")
u.RawQuery = q.Encode()
resp, err := http.Get(u.String())
```
Q: HTTP 요청 타임아웃 설정은 어떻게 하나요?
A: `http.Client`의 `Timeout` 필드를 설정합니다.
예:
```go
client := http.Client{
Timeout: 10 * time.Second,
}
resp, err := client.Get("https://example.com")
```

Q: HTTP 응답에서 본문을 어떻게 읽나요?
A: `resp.Body`는 `io.ReadCloser`이므로 `io.ReadAll` 등으로 읽고 반드시 `Close()` 합니다.
예:
```go
body, err := io.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Println(string(body))
resp.Body.Close()
```

Q: JSON 데이터를 POST 요청으로 보내는 법은?
A: 데이터를 JSON으로 인코딩하고 `Content-Type` 헤더를 `application/json`으로 설정합니다.
예:
```go
data := map[string]string{"name": "John"}
jsonData, _ := json.Marshal(data)
req, _ := http.NewRequest("POST", "https://example.com/api", bytes.NewBuffer(jsonData))
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
```

Q: Go에서 HTTPS 요청의 인증서 검증을 무시하려면?
A: `http.Transport`에서 `TLSClientConfig.InsecureSkipVerify`를 `true`로 설정합니다. 단, 보안상 권장되지 않습니다.
예:
```go
tr := &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
}
client := &http.Client{Transport: tr}
resp, err := client.Get("https://self-signed.badssl.com/")
```

Q: Go에서 HTTP 요청을 동기/비동기로 보내는 차이는?
A: 기본적으로 `http.Client.Do`는 동기식 호출입니다. 비동기로 처리하려면 고루틴(goroutine)을 사용해 요청을 별도로 실행합니다.
예:
```go
go func() {
resp, err := http.Get("https://example.com")
// 처리
}()
```
Go 언어에서 HTTP 요청을 보내는 방법은 매우 간단하고 직관적입니다.

Go의 표준 라이브러리인 `net/http` 패키지를 사용하면 GET, POST, PUT, DELETE 등 다양한 HTTP 요청을 쉽게 수행할 수 있습니다.

아래에서는 Go에서 HTTP 요청을 보내는 방법에 대해 자세히 설명하겠습니다.

1. 기본적인 HTTP GET 요청 가장 간단한 형태의 HTTP 요청은 GET 요청입니다.

아래는 GET 요청을 보내고 응답을 처리하는 예제입니다.

```go package main import ( "fmt" "io/ioutil" "net/http" ) func main() { // GET 요청을 보낼 URL url := "https://jsonplaceholder.typicode.com/posts/1" // GET 요청을 보냄 response, err := http.Get(url) if err != nil { fmt.Println("Error:", err) return } defer response.Body.Close() // 함수 종료 시 응답 본체를 닫음 // 응답 본체를 읽음 body, err := ioutil.ReadAll(response.Body) if err != nil { fmt.Println("Error reading body:", err) return } // 응답 상태 코드와 본체 출력 fmt.Println("Response Status:", response.Status) fmt.Println("Response Body:", string(body)) } ```

2. HTTP POST 요청 POST 요청은 서버에 데이터를 전송할 때 사용됩니다.

아래는 JSON 데이터를 POST 요청으로 전송하는 예제입니다.

```go package main import ( "bytes" "encoding/json" "fmt" "net/http" ) func main() { url := "https://jsonplaceholder.typicode.com/posts" // 전송할 데이터 postData := map[string]string{ "title": "foo", "body": "bar", "userId": "1", } jsonData, err := json.Marshal(postData) if err != nil { fmt.Println("Error marshalling JSON:", err) return } // POST 요청을 보냄 response, err := http.Post(url, "application/json", bytes.NewBuffer(jsonData)) if err != nil { fmt.Println("Error:", err) return } defer response.Body.Close() // 응답 본체를 읽음 body, err := ioutil.ReadAll(response.Body) if err != nil { fmt.Println("Error reading body:", err) return } // 응답 상태 코드와 본체 출력 fmt.Println("Response Status:", response.Status) fmt.Println("Response Body:", string(body)) } ```

3. HTTP 요청에 헤더 추가하기 HTTP 요청에 헤더를 추가하려면 `http.NewRequest` 함수를 사용하여 요청을 생성한 후, 헤더를 설정할 수 있습니다.

```go package main import ( "bytes" "encoding/json" "fmt" "net/http" ) func main() { url := "https://jsonplaceholder.typicode.com/posts" postData := map[string]string{ "title": "foo", "body": "bar", "userId": "1", } jsonData, err := json.Marshal(postData) if err != nil { fmt.Println("Error marshalling JSON:", err) return } // 새로운 요청 생성 req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonData)) if err != nil { fmt.Println("Error creating request:", err) return } // 헤더 추가 req.Header.Set("Content-Type", "application/json") req.Header.Set("Authorization", "Bearer your_token_here") // 클라이언트 생성 및 요청 전송 client := &http.Client{} response, err := client.Do(req) if err != nil { fmt.Println("Error:", err) return } defer response.Body.Close() // 응답 본체를 읽음 body, err := ioutil.ReadAll(response.Body) if err != nil { fmt.Println("Error reading body:", err) return } // 응답 상태 코드와 본체 출력 fmt.Println("Response Status:", response.Status) fmt.Println("Response Body:", string(body)) } ```

4. 오류 처리 HTTP 요청을 보낼 때는 항상 오류 처리를 신경 써야 합니다.

위의 예제에서는 각 단계에서 발생할 수 있는 오류를 체크하고, 오류가 발생하면 적절한 메시지를 출력하도록 했습니다.



5. 응답 처리 HTTP 응답은 상태 코드와 본체로 구성됩니다.

상태 코드는 요청의 성공 여부를 나타내며, 본체는 서버에서 반환한 데이터입니다.

응답 본체는 JSON, XML, HTML 등 다양한 형식일 수 있으므로, 필요한 경우 적절한 방식으로 파싱해야 합니다.



6. Go에서 HTTP 요청을 보내는 것은 `net/http` 패키지를 통해 간단하게 수행할 수 있습니다.

GET, POST 요청을 포함하여 다양한 요청을 처리할 수 있으며, 요청에 헤더를 추가하거나 오류를 처리하는 방법도 쉽게 구현할 수 있습니다.

이러한 기능을 활용하여 RESTful API와의 통신, 웹 크롤링, 데이터 전송 등 다양한 작업을 수행할 수 있습니다.

작성자: 김지우 [비회원] | 작성일자: 1년 전 2024-09-19 01:50:37
조회수: 130 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.