Content-type | data | body* |
---|---|---|
application/json | data:= []byte(`{"key":"value"}`) | bytes.NewBuffer(data) |
application/x-www-form-urlencoded | data:= url.Values{"key": {"value"},} | bytes.NewBufferString(data.Encode()) |
*body : http.NewRequest()
's 3rd parameter
GET으로 요청할 때 url 뒤에 param1=data1¶m2=data2
이런 식으로 추가 데이터를 전송할 수 있는데, 같은 방식을 POST에서도 할 수 있으며 이것이 Content-type: application/x-www-form-urlencoded
이다. 반면에 json 객체를 전송하는 POST는 Content-type: application/json
를 쓴다. 보낼 데이터를 보고 content-type 잘 명시하면 됨.
아래는 예제코드들.
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)
}
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}`);
});