go

Go Http Post 호출

까오기 2024. 7. 16. 11:18

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