Go Http Post 호출
Go에서 HTTP POST 요청을 보내고, 값을 전달하며 헤더를 설정하고, 요청 본문에 JSON 데이터를 포함하는 방법을 예제로 보여드리겠습니다. 이 예제에서는 net/http 패키지를 사용합니다.
예제 코드
다음은 HTTP POST 요청을 보내고 JSON 데이터를 요청 본문에 포함하는 예제 코드입니다:
package main
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"log"
"net/http"
)
type PostData struct {
UserID int `json:"userId"`
Title string `json:"title"`
Body string `json:"body"`
}
func main() {
// URL 설정
url := "https://jsonplaceholder.typicode.com/posts"
// POST 요청 본문 데이터
postData := PostData{
UserID: 1,
Title: "foo",
Body: "bar",
}
// JSON으로 인코딩
jsonData, err := json.Marshal(postData)
if err != nil {
log.Fatalf("Failed to marshal JSON: %v", err)
}
// 요청 생성
req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
if err != nil {
log.Fatalf("Failed to create HTTP request: %v", err)
}
// 헤더 설정
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", "Bearer YOUR_ACCESS_TOKEN")
// 클라이언트 생성
client := &http.Client{}
// 요청 보내기
resp, err := client.Do(req)
if err != nil {
log.Fatalf("HTTP POST request failed: %v", err)
}
defer resp.Body.Close()
// 응답 바디 읽기
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatalf("Failed to read response body: %v", err)
}
// 응답 출력
fmt.Println("Response Status:", resp.Status)
fmt.Println("Response Body:", string(body))
}
코드 설명
- 패키지 선언 및 import필요한 패키지들을 import 합니다. bytes 패키지는 바이트 버퍼를 사용하기 위해, encoding/json 패키지는 JSON 인코딩 및 디코딩을 위해 사용됩니다.
package main
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"log"
"net/http"
)
- 데이터 구조체 정의요청 본문에 보낼 데이터를 정의하는 구조체입니다. JSON 태그를 사용하여 구조체 필드를 JSON 키와 매핑합니다.
type PostData struct {
UserID int `json:"userId"`
Title string `json:"title"`
Body string `json:"body"`
}
- URL 설정 및 POST 데이터 생성요청을 보낼 URL과 요청 본문 데이터를 설정합니다.
url := "https://jsonplaceholder.typicode.com/posts"
postData := PostData{
UserID: 1,
Title: "foo",
Body: "bar",
}
- JSON 데이터 인코딩구조체 데이터를 JSON 형식으로 변환합니다.
jsonData, err := json.Marshal(postData)
if err != nil {
log.Fatalf("Failed to marshal JSON: %v", err)
}
- HTTP 요청 생성http.NewRequest 함수를 사용하여 POST 요청을 생성합니다. 요청 본문에 JSON 데이터를 포함합니다.
req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
if err != nil {
log.Fatalf("Failed to create HTTP request: %v", err)
}
- 헤더 설정Content-Type 헤더를 application/json으로 설정하여 요청 본문이 JSON 형식임을 지정합니다. 필요에 따라 Authorization 헤더를 설정합니다.
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", "Bearer YOUR_ACCESS_TOKEN")
- 클라이언트 생성 및 요청 보내기HTTP 클라이언트를 생성하고 요청을 보냅니다. 응답을 resp 변수에 저장합니다. defer resp.Body.Close()를 사용하여 응답 바디를 닫습니다.
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
log.Fatalf("HTTP POST request failed: %v", err)
}
defer resp.Body.Close()
- 응답 바디 읽기 및 출력응답 바디를 읽고 문자열로 변환하여 출력합니다.
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatalf("Failed to read response body: %v", err)
}
fmt.Println("Response Status:", resp.Status)
fmt.Println("Response Body:", string(body))
실행
위의 코드를 main.go 파일에 저장하고, 터미널에서 다음 명령어를 실행하여 코드를 실행합니다:
go run main.go
예상 출력
다음은 예상되는 출력입니다. 출력 내용은 서버로부터 받은 응답입니다:
Response Status: 201 Created
Response Body: {
"userId": 1,
"title": "foo",
"body": "bar",
"id": 101
}
이 예제에서는 `https://jsonplaceholder.typicode.com
/posts엔드포인트에 HTTP POST 요청을 보내고, JSON 형식의 데이터를 요청 본문에 포함하여 서버로 전송합니다. 이 요청은userId, title, 및 body`를 포함한 데이터를 전송하며, 서버는 이 데이터를 처리하고 응답으로 JSON 데이터를 반환합니다.
추가 설명
데이터 구조체:
구조체 PostData는 JSON 데이터를 쉽게 구성하고 관리할 수 있도록 합니다. JSON 태그를 사용하여 구조체 필드와 JSON 키를 매핑합니다.
JSON 인코딩:
json.Marshal 함수는 구조체를 JSON 형식으로 인코딩합니다. 이 인코딩된 데이터는 HTTP 요청의 본문에 포함됩니다.
HTTP 요청 생성:
http.NewRequest 함수를 사용하여 POST 요청을 생성합니다. 이 함수는 HTTP 메서드, URL, 및 요청 본문 데이터를 인수로 받습니다.
헤더 설정:
req.Header.Set 메서드를 사용하여 요청 헤더를 설정합니다. Content-Type 헤더를 application/json으로 설정하여 서버에 JSON 데이터를 전송할 것임을 알립니다. Authorization 헤더는 필요에 따라 설정할 수 있으며, 여기서는 예제로 Bearer 토큰을 사용하고 있습니다.
HTTP 클라이언트 사용:
HTTP 클라이언트를 생성하고, client.Do(req) 메서드를 사용하여 요청을 보냅니다. 응답은 resp 변수에 저장됩니다.
응답 처리:
ioutil.ReadAll 함수를 사용하여 응답 본문을 읽고, 이를 문자열로 변환하여 출력합니다.
이 예제는 실제로 jsonplaceholder.typicode.com이라는 테스트 API를 사용하지만, 이 패턴을 사용하여 다른 실제 API에도 쉽게 적용할 수 있습니다. 요청 URL, 요청 본문 데이터, 헤더 등을 필요에 따라 조정하여 다양한 API와 상호작용할 수 있습니다.
출처 : chatGPT