content-type에 따른 golang POST 데이터 전송 방법

Roeniss Moon·2020년 12월 1일
1

고랭 수첩

목록 보기
1/1

tl;dr

Content-typedatabody*
application/jsondata:= []byte(`{"key":"value"}`)bytes.NewBuffer(data)
application/x-www-form-urlencodeddata:= url.Values{"key": {"value"},}bytes.NewBufferString(data.Encode())

*body : http.NewRequest()'s 3rd parameter

부가설명

GET으로 요청할 때 url 뒤에 param1=data1&param2=data2 이런 식으로 추가 데이터를 전송할 수 있는데, 같은 방식을 POST에서도 할 수 있으며 이것이 Content-type: application/x-www-form-urlencoded이다. 반면에 json 객체를 전송하는 POST는 Content-type: application/json를 쓴다. 보낼 데이터를 보고 content-type 잘 명시하면 됨.

아래는 예제코드들.

예제: json 데이터 전송하기

func SendJson() {
    client := &http.Client{}

    url := "http://localhost:3000"
    var jsonStr = []byte(`{"title":"Buy cheese and bread for breakfast."}`)
    req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonStr))
    req.Header.Set("Content-Type", "application/json")
    
    resp, err := client.Do(req)
    if err != nil {
        log.Fatalln(err)
    }
    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        log.Fatalln(err)
    }

    data := string(body)

    log.Println(data)
}

예제: x-www-form-urlencoded 데이터 전송하기

func SendUrlencoded(){
    client := &http.Client{}

    bodyData := url.Values{
      "title": {"Buy cheese and bread for breakfast."},
      "content": {"123"}
    }
    
    req, _ := http.NewRequest("POST", "http://localhost:3000", bytes.NewBufferString(bodyData.Encode()))
    // or, 
req, _ := http.NewRequest("POST", "http://localhost:3000", bytes.NewBufferString("title=Buy cheese and bread for breakfast.&content=123"))
    req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
    
    resp, err := client.Do(req)
        if err != nil {
        log.Fatalln(err)
    }
    defer resp.Body.Close()
    
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        log.Fatalln(err)
    }

    data := string(body)

    log.Println(data)
}

그 외에

https://developer.mozilla.org/ko/docs/Web/HTTP/Methods/POST 를 보니 바이너리 데이터는 urlencoded 방식 쓰지 말라고 한다.

직접 확인하기

아래 코드로 node express 서버 띄워놓고 확인할 수 있다.

const express = require("express");
const app = express();
const port = 3000;

app.use(express.json()); // 이것만 주석풀면 json데이터 & content-type:application/json 데이터만 로깅
app.use(express.urlencoded({ extended: true })); // 이것만 주석풀면 url.Values & content-type:applicationx-www-form-urlencoded 데이터만 로깅

app.all("/", (req, res) => {
  console.log(req.body);
  res.send("OK");
});

app.listen(port, () => {
  console.log(`Example app listening at http://localhost:${port}`);
});
profile
기능이 아니라 버그예요

0개의 댓글