[Node.js] 다른 웹 사이트 데이터 가져오기(GET, POST)

서버에서 다시 다른 웹 사이트를 접속하여 데이터를 가져온 후 응답하는 과정이 필요할 때도 있다. 이 경우 서버에서 HTTP 클라이언트 기능을 사용하게 된다. http 모듈은 서버 기능 이외에 클라이언트 기능도 제공한다. 즉, HTTP 클라이언트가 GETPOST 방식으로 다른 웹 서버에 데이터를 요청할 수 있다.

먼저 GET과 POST의 차이를 알아보자. HTTP 요청 포맷을 보면 크게 헤더, 본문으로 나뉘는데 GET 방식은 헤더 부분에 요청 정보들을 넣어 보내고, POST 방식은 본문 부분에 요청 정보를 넣어 보낸다. 기능상으로는 요청 정보를 보낸다는 점에서 같지만 보안 등의 이슈가 있을 때나 파일을 업로드하는 경우 POST 방식을 주로 사용한다.

GET 방식으로 데이터 요청하기

http 모듈을 사용해서 GET 방식으로 다른 사이트에 데이터를 요청해보자.

var http = require('http');
var options = {
    host: 'www.netflix.com',
    port: 80,
    path: '/'
};
var req = http.get(options, function(res){
    var resData = '';
    res.on('data'function(chunk){
        resData += chunk;
    });
    
    res.on('end'function(){
        console.log(resData);
    });
});
req.on('error'function(err){
    console.log('오류 발생: ' + err.message);
});
cs

http 객체의 get() 메소드를 사용하면 다른 사이트에 요청을 보내고 응답을 받아서 처리할 수 있다. get() 메소드의 첫 번째 파라미터는 다른 사이트의 정보를 가진 객체(options), 두 번째 파라미터는 콜백 함수이다. 콜백 함수 안에 응답 데이터를 받는 코드를 작성하는데, data 이벤트와 end 이벤트로 처리하면 된다.

data 이벤트: 데이터를 받고 있는 상태일 때 발생
end 이벤트: 응답 데이터를 모두 받은 후 발생

파일을 실행하면 넷플릭스에서 받아 온 응답이 콘솔에 출력된다. (사이트에 따라 출력되지 않을 수도 있다)

POST 방식으로 데이터 요청하기

POST 방식으로 요청할 경우에는 request() 메소드를 사용한다. 이 request() 메소드는 get() 메소드와 사용 방식이 약간 다르다. 요청을 보내려면 요청 헤더와 본문을 직접 설정해야 한다.

http 모듈을 이용해 POST 방식으로 구글에 데이터를 요청해보자.

var http = require('http');
 
var options = {
    host: 'www.google.com',
    port: 80,
    method: 'POST',
    path: '/',
    headers: {}
};
 
var resData = '';
 
var req = http.request(options, function(res){
    res.on('data'function(chunk){
        resData += chunk;
    });
    
    res.on('end'function(){
        console.log(resData);
    });
});
 
options.headers['Content-Type'= 'application/x-www-form-urlencoded';
req.data = "q=actor";
options.headers['Content-Length'= req.data.length;
 
req.on('error'function(err){
    console.log('오류 발생: ' + err.message);
});
 
req.write(req.data);
req.end();
cs

사이트에 요청할 때 필요한 요청 파라미터는 요청 객체의 data 속성으로 설정한다. 이 속성 값에 따라 Content-Length 헤더의 값이 달라지므로 request() 메소드로 만든 요청 객체에 이 정보를 추가로 설정한다. 요청할 때는 write() 메소드로 요청 본문 데이터를 req 객체에 쓴 후 end() 메소드를 사용해서 전송한다.

구글 사이트에서는 POST 요청을 받지 못하게 되있으므로 오류가 표시될 것이다. 코드에 오류가 있는 것은 아니다.

댓글 없음:

Powered by Blogger.