🌈 프로그래밍

[ node/express ] 외부 API post 요청 시 json Array 객체를 포함해서 전송하기

반응형

 

외부 API를 사용하려면

외부 api 요청을 하기 위해서는 가장 먼저 제공해주는 API document를 이해하는 것이 첫 번째 단계이다.

어떻게 요청을 보내야 하고 필수 값은 어떤 것이 있는지, 필요한 헤더 정보는 무엇이 있는지 등등 파악해야 한다.

문서도 꼼꼼이 보지 않고 요청을 날리는 바보 같은 행동은 이제 그만~ (제 이야기에요)

 

POST 요청 시 필요한 값 분석

내가 사용하려고 하는 외부 API를 분석해보니 다음과 같은 데이터가 필요했다.

  1. path : str
  2. method : str
  3. header : json object
  4. 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 요청이 있는 괴이한 코드이지만 테스트를 위한 거니 눈감아주세요~

 

반응형