본문 바로가기
블로그 이미지

방문해 주셔서 감사합니다! 항상 행복하세요!

  
   - 문의사항은 메일 또는 댓글로 언제든 연락주세요.
   - "해줘","답 내놔" 같은 질문은 답변드리지 않습니다.
   - 메일주소 : lts06069@naver.com


Node.js

Nodejs http client, NodeJs Http 클라이언트, 노드JS Http 요청

야근없는 행복한 삶을 위해 ~
by 마샤와 곰 2019. 11. 12.

 

 

Nodejs를 활용해서 백그라운드에서 특정 주소로 요청하는 방법은 http 모듈을 설치하여도 되지만, request 모듈이 조금 더 사용하기가 쉽고 편리하다.

아래 명령어를 통해서 request 모듈을 설치하자.

npm install request

 

정말 단순하게 특정 사이트에서 데이터를 가져오려면 읽어온 모듈에 주소, 콜백 함수를 넣어주면 된다.

const request = require('request');
request('https://www.naver.com', (error, response, body) => {
  console.log('simple error:', error);
  console.log('simple statusCode:', response && response.statusCode); 
  console.log('body:', body);
})

 

네이버 사이트에 접속해서 데이터를 긁어오는(?) 코드가 완성이 되었다.

실제로 동작시키면 html 파일 내용을 가져와서 출력을 한다.

 

재미있는점은 request라는 객체가 pipe를 통해서 행위 자체를 전달 할 수 있다는 점이다.

아래코드를보면,

const request = require('request');
const fs = require('fs');

request('https://www.naver.com').pipe(fs.createWriteStream('D:/test.html'));  //???

pipe를 통해서 request객체의 콜백 데이터를 해당 디렉토리에 있는 test.html파일에 저장하게 하였다.

네이버 페이지를 읽어온다음에 createWriteStream에 해당하는 행위를 대신 동작하여준다.

 

반대로 파일을 읽은뒤에 해당내용을 서버로 전송 할 수도 있다.

const request = require('request');
const fs = require('fs');
fs.createReadStream('D:/test.json').pipe(request.put('http://테스트주소'));

해당 디렉토리의 json 파일을 읽어와서 원하는 서버에 json형식으로 요청을 할 수 있다.

json, xml을 읽어와서 보내는 방법으로 주로 사용되기도 하는데 참 편리하다.

 

get, post, delete, put 등 여러 방식을 지원하며 대표적으로 사용하는 get과 post방식의 모습이다.

const request = require('request');

//post방식
request.post('https://www.naver.com', {form:{key:'value'}}, (error, response, body) =>{
    console.log('post error:', error);
    console.log('post statusCode:', response && response.statusCode); 
    console.log('body:', body);
});

//get방식
request.get('https://www.naver.com?param=a&param2=b', (error, response, body) =>{
    console.log('get error:', error);
    console.log('get statusCode:', response && response.statusCode); 
    console.log('body:', body);
});

 

당연하게도 파일전송을 위한 multipart/form-data 방식을 지원한다.

전송하는 데이터 형식을 json에 맞추어서 보내기만 하면 된다.

받는서버는 java로 만들어진 간단한 서버를 통해 받아보았다.

const request = require('request');
const fs = require('fs');


//multipart/form-data 방식
var datas = {
    single_param: 'my_value',  //단순 데이터 
    array_params: [1, 2, 3, 4, 5],    //배열형태 데이터
    single_file: fs.createReadStream('D:/test.png'),  //파일 1개보낼때
    array_files: [  //배열형식으로 파일들을 보낼 때..받는곳에서도 배열처리해서 받아야하는 불편함이 존재한다.
        fs.createReadStream('D:/test2.png'),
        fs.createReadStream('D:/test3.png')
    ],
    custom_file: {  //파일형태를 가공해서 보낼 때
        value: fs.createReadStream('D:/test3.png'),
        options: {
            filename: 'cnv_test.png',
            contentType: 'image/png'
        }
    }
};
request.post({url:'http://127.0.0.1:8080/testUpload.do', formData: datas}, (error, response, body) =>{
    console.log('error:', error);
    console.log('statusCode:', response && response.statusCode); 
    //console.log('body:', body);
});

 

파일을 배열로 보내면 받는 곳 에서도 배열의 배열처리를 해야되는 불편함이 존재한다.

위내용으로 서버에 전송하여서 나온 콘솔모습이다.

파일이 들어옴을 알 수 있다!

 

 

위 소스코드 전체내용이다.

const request = require('request');
const fs = require('fs');

//노말한 요청

request('https://www.naver.com', (error, response, body) => {
  console.log('simple error:', error);
  console.log('simple statusCode:', response && response.statusCode); 
  console.log('body:', body);
});

//요청한 객체 자체를 pipe를 통해 파일로 저장하는 방법.
request('https://www.naver.com').pipe(fs.createWriteStream('D:/test.html'));

//읽어온 파일을 pipe를 통해 주소로 요청하는 방법, json, xml을 읽어와서 보내는 방법으로 주로 사용.
fs.createReadStream('D:/test.html').pipe(request.put('http://주소'));


//post방식
request.post('https://www.naver.com', {form:{key:'value'}}, (error, response, body) =>{
    console.log('post error:', error);
    console.log('post statusCode:', response && response.statusCode); 
    console.log('body:', body);
});

//get방식

request.get('https://www.naver.com', (error, response, body) =>{
    console.log('get error:', error);
    console.log('get statusCode:', response && response.statusCode); 
    console.log('body:', body);
});


//multipart/form-data 방식
var datas = {
    single_param: 'my_value',  //단순 데이터 
    array_params: [1, 2, 3, 4, 5],    //배열형태 데이터
    single_file: fs.createReadStream('D:/test.png'),  //파일 1개보낼때
    array_files: [  //배열형식으로 파일들을 보낼 때..받는곳에서도 배열처리해서 받아야하는 불편함이 존재한다.
        fs.createReadStream('D:/test2.png'),
        fs.createReadStream('D:/test3.png')
    ],
    custom_file: {  //파일형태를 가공해서 보낼 때
        value: fs.createReadStream('D:/test3.png'),
        options: {
            filename: 'cnv_test.png',
            contentType: 'image/png'
        }
    }
};
request.post({url:'http://127.0.0.1:8080/testUpload.do', formData: datas}, (error, response, body) =>{
    console.log('error:', error);
    console.log('statusCode:', response && response.statusCode); 
    console.log('body:', body);
});

 

 

또한, 특정 서버에서 암호화된 요청이 필요한 경우에는 마찬가지로 json형식을 잘 지켜서 요청을 하면된다.

SSL 요청시 인증키가 필요한 경우를 가정하면 아래처럼 키 값을 파라미터에 포함시켜주어야 한다.

const request = require('request');
const fs = require('fs');

//인증키 분들..
const certFile = 'ssl/client.crt';
const keyFile = 'ssl/client.key';
const caFile = 'ssl/ca.cert.pem';

 
var param = {
    url: 'https://인증키 접속이 필요한 서버',
    cert: fs.readFileSync(certFile),
    key: fs.readFileSync(keyFile),
    passphrase: '비번',
    ca: fs.readFileSync(caFile)
};
 
request.get(param, (error, response, body) =>{
    console.log('error:', error);
    console.log('statusCode:', response && response.statusCode); 
    console.log('body:', body);
});

 

request 모듈은 콜백용 함수를 지원하므로 따로 Promise를 사용하지 않아도 되는 편리함이 좋은 것 같다.

물론, 전송하는 파일이 대용량이면서 다양한 요청이 들어오게 된다면 클러스터나 Promise를 사용해 주어야 한다.

대용량 파일, 트래픽이 많은 경우에는 단일 워커로는 한계가 있으므로 클러스터를 통하여 처리를 하거나, Promise를 활용해서 행위에 대한 순서를 정해주도록 하자.

 

 

반응형
* 위 에니메이션은 Html의 캔버스(canvas)기반으로 동작하는 기능 입니다. Html 캔버스 튜토리얼 도 한번 살펴보세요~ :)
* 직접 만든 Html 캔버스 애니메이션 도 한번 살펴보세요~ :)

댓글