외부 API를 사용하려면
외부 api 요청을 하기 위해서는 가장 먼저 제공해주는 API document를 이해하는 것이 첫 번째 단계이다.
어떻게 요청을 보내야 하고 필수 값은 어떤 것이 있는지, 필요한 헤더 정보는 무엇이 있는지 등등 파악해야 한다.
문서도 꼼꼼이 보지 않고 요청을 날리는 바보 같은 행동은 이제 그만~ (제 이야기에요)
POST 요청 시 필요한 값 분석
내가 사용하려고 하는 외부 API를 분석해보니 다음과 같은 데이터가 필요했다.
- path : str
- method : str
- header : json object
- body : json Array
path는 요청을 어디로 날릴지에 대한 endpoint이고,
method는 요청을 어떻게 할 건지, get인지 post인지..
그렇지만 나는 npm request 모듈을 사용했기 때문에 굳이 요청할 때 2번 데이터를 넣지 않고 아래와 같이 요청을 보내면 된다.
request.post(...)
그리고 세 번째 포함되어야 하는 헤더 정보는 아래와 같이 만들어주었다.
headers : {
"Content-Type" : "application/json",
"userId": "myplaycompany"
}
그리고 마지막으로 body에는 JSON Array를 담아야 했다. 그래서 나는 처음에 아래와 같이 하면 되겠거니 했다.
data = [
{
"key1": "val1"
},
{
"key2": "val2"
},
]
위와 같이 data Array 내에 dict object들을 넣어주고
body : data
이렇게 한 뒤, 아래와 같이 지금까지의 모든 데이터들을 갖고 요청을 보내기 전에 options에 포함시켜주었다.
const options = {
url : `${dev}/v2/sender/send`,
headers : {
"Content-Type" : "application/json",
"userId": "myplaycompany"
},
body : data
};
그랬더니 아래와 같은 오류를 직면했다..
error = Error: Argument error, options.body.
node:_http_outgoing:843
throw new ERR_INVALID_ARG_TYPE(
^
TypeError [ERR_INVALID_ARG_TYPE]: The "chunk" argument must be of type string or an instance of Buffer or Uint8Array. Received an instance of Object
at new NodeError (node:internal/errors:387:5)
at write_ (node:_http_outgoing:843:11)
at ClientRequest.write (node:_http_outgoing:808:15)
at Request.write (/Users/suyoung/dev/node/node_modules/request/request.js:1494:27)
at /Users/suyoung/dev/node/node_modules/request/request.js:546:20
at Array.forEach (<anonymous>)
at end (/Users/suyoung/dev/node/node_modules/request/request.js:545:23)
at Immediate.<anonymous> (/Users/suyoung/dev/node/node_modules/request/request.js:578:7)
at processImmediate (node:internal/timers:466:21) {
code: 'ERR_INVALID_ARG_TYPE'
}
가장 첫 줄에는 console.log로 찍어본 에러였는데 options.body가 잘못되어 뭔가 이상하니 수정해라였다.
그래서 타입 자체를 json Array로 만들어주어야 하므로 아래와 같이 해준다면 바로 해결할 수 있었다.
body : JSON.stringify(data)
오늘도 하나 알아갑니다~!
main.js 전체 코드
const express = require('express');
const request = require('request');
const bodyParser = require('body-parser');
const app = express();
app.use(bodyParser.urlencoded({extended:true}));
app.use(bodyParser.json());
const secret_key = "secret_key"
dev = "https://dev-api.korea.net"
prod = "https://prod-api.korea.kr"
app.get('/', function(req, res) {
// post body에 포함시킬 json Array 데이터들..
const data = [
{
"key1", "value1",
"key2", "value2",
"key3", "value3"
},
]
const options = {
url : `${dev}/v2/sender/send`,
headers : {
"Content-Type" : "application/json",
"userId": "myplaycompany"
},
// array를 json화 한다.
body : JSON.stringify(data)
};
// 요청 보내기
request.post(options, function (error, response, body) {
if (!error) {
console.log("response OK")
console.log(response.body)
res.writeHead(200, {'Content-Type': 'text/json;charset=utf-8'});
res.status(200).end();
} else {
console.log("error = " + error)
res.status(500).end();
}
});
})
app.listen(3000, function() {
console.log("Server is listening on port 3000...");
});
대충 그냥 로컬로 express 서버 하나 띄우고, localhost:3000/으로 get 요청을 쏘면 동작하는 로직이다.
get 요청 내에 post 요청이 있는 괴이한 코드이지만 테스트를 위한 거니 눈감아주세요~
'🌈 프로그래밍' 카테고리의 다른 글
[ dbdiagram.io ] CLI 명령으로 DDL DB Diagram 쉽게 뽑기 (0) | 2022.06.09 |
---|---|
[ Clean Code ] 클린 코딩을 하는 8가지 방법 (0) | 2021.11.10 |
[ Code Refactoring ] 코드 리팩토링에 대해서 알아보자 (0) | 2021.11.10 |