NodeJS HTTP 요청하기
NodeJS의 http 모듈은 웹서버 기능도 할 수 있지만 웹 클라이언트의 기능도 수행할 수 있습니다.
웹클라이언트 기능은 나만의 브라우저를 만들 때에나 웹 크롤링 등에 사용할 수 있습니다.
또한 Node를 웹 서버로 이용할 때에도 웹 클라이언트로서 동작할 필요가 있는데 예를 들어 facebook이나 google 등의 open API를 사용하는 경우에 필요할 것입니다.


만약 facebook 로그인 api를 사용한다면 사용자가 나의 웹서버에 인증을 요청하는 경우 나의 node 웹 서버에서 facebook으로 인증 api 요청을 날리게 되고 facebook 인증 서버에서는 인증에 대한 결과를 리턴하는데 이때 나의 node 서버는 facebook 인증 서버로부터 웹 클라이언트로 동작한다고 할 수 있습니다.


NodeJS 웹서버에서 HTTP GET방식 요청하기
앞서 설명했던 구조를 재현하기 위해 Node 서버를 다음과 같이 두 개 준비할 것입니다.
주소는 모두 현재 자신의 컴퓨터인 localhost(127.0.0.1) 이며, 대신에 포트번호가 서로 다른 7777 서버와 8888서버를 구성할 것입니다.



최초 클라이언트는 8888서버에 HTTP 요청을 하지만 8888서버는 자신이 클라이언트가 되어 7777서버에 요청을 하게 됩니다.
7777서버는 결과를 응답하고 8888서버는 7777서버에 응답받은 결과를 그대로 Client에게 응답하게 됩니다.
Client 입장에서는 8888서버가 처리한 결과인것으로 생각할 것입니다.
이것은 어떤 관점에서 보면 8888서버가 프록시 서버인것으로 볼 수도 있지만 실제 운영중인 환경이라면 8888서버와 7777서버는 서로 연관이 없는 서버들끼리의 통신일 가능성이 높습니다.

구현한 코드를 보면 다음과 같습니다.
테스트시에 두 개의 서버를 각각 띄우고(포트번호가 다르므로 둘 다 띄울 수 있음) 웹브라우저에서 8888서버에 요청합니다.

7777서버 소스
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
var http = require('http');
 
 
var server = http.createServer();
 
 
var port = 7777;
server.listen(port, function() {
    console.log('7777 server start');
});
 
 
server.on('request'function(req, res) {
 
 
    res.writeHead(200, {"Content-Type""text/html; charset=utf-8"});
    res.write("<html>");
    res.write("  <head>");
    res.write("    <title>node JS Web Test</title>");
    res.write("  </head>");
    res.write("  <body>");
    res.write("    <h1> node JS 7777 서버 응답 페이지 입니다.</h1>");
    res.write("  </body>");
    res.write("</html>");
    res.end();
      
});
 
cs


8888서버 소스
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
var http = require('http');
 
var server = http.createServer();
 
var port = 8888;
 
server.listen(port, function() {
    console.log('8888 server start');
});
 
 
 
 
 
var options = {
    host: 'localhost',
    port: 7777,
    path: '/'
};
 
 
server.on('request'function(req, res) {
 
 
    var apiReq = http.get(options, function(apiRes) {
        //api 호출결과 인코딩
        apiRes.setEncoding('utf8');
 
 
        // 응답 처리
        var resData = '';
        apiRes.on('data'function(chunk) {
            resData += chunk;
        });
 
 
        apiRes.on('end'function() {
            res.writeHead(200, {"Content-Type""text/html; charset=utf-8"});
            res.write(resData);
            res.end();
        });
    });
 
 
    apiReq.on('error'function(err) {
        console.log(err.message);
    });
 
 
});
cs


8888서버가 이번 글의 핵심 로직이며 그 중에서도 중요한 부분은 다음과 같습니다.
Client로부터 요청이 오게 되면 실행되는 로직입니다.
http.get() 메서드를 통해 get요청을 하며 요청 대상에 대한 정보를 option 객체로 담아 넘깁니다.
이후 응답받은 데이터를 받아서 Client에게 그대로 출력하게 됩니다.

데이터를 받을때에는 데이터를 받는 이벤트인 data 이벤트와 데이터를 받기 완료했을때 발생하는 end 이벤트를 활용합니다.
data 이벤트의 콜백함수로 resData += chunk; 를 실행하고 있는데, 응답받는 데이터가 거대한 경우에는 해당 콜백함수가 여러번에 걸쳐 실행될 수 있기 때문입니다.
1
2
3
4
5
var options = {
    host: 'localhost',                
    port: 7777,
    path: '/'
};
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    var apiReq = http.get(options, function(apiRes) {
        //api 호출결과 인코딩
        apiRes.setEncoding('utf8');
 
 
        // 응답 처리
        var resData = '';
        apiRes.on('data'function(chunk) {
            resData += chunk;
        });
 
 
        apiRes.on('end'function() {
            res.writeHead(200, {"Content-Type""text/html; charset=utf-8"});
            res.write(resData);
            res.end();
        });
    });
 
 
    apiReq.on('error'function(err) {
        console.log(err.message);
    });
cs
 


다음글
블로그 이미지

도로락

IT, 프로그래밍, 컴퓨터 활용 정보 등을 위한 블로그

댓글을 달아 주세요! 질문 환영합니다!