sitepoint.com의 Node.js 관련 Article 번역

  1. [번역] An Introduction to Node.js
  2. [번역] Creating a HTTP Server in Node.js
  3. [번역] HTTP Authentication in Node.js
  4. [번역] Cloud Deployment of Node.js Applications with Nodejitsu
  5. [번역] Accessing the File System in Node.js

원문 sitepoint.comMaking HTTP Requests in Node.js

오역 주의 오역을 발견하시면 꼭 알려주세요~ :-)

Making HTTP Requests in Node.js

이전의 글에서 Node.js 서버를 만드는 것에 초점을 둔것은 HTTP 요청을 처리하기 위해서였다. 이번 글은 문제를 반대로 생각해서 당신의 Node.js 애플리케이션이 HTTP 요청을 어떻게 만들어 내는지를 보여줄 것이다. 아마 왜 그렇게 해야 하는지 의문이 들지도 모른다. 문득 떠오르는 애플리케이션이 두개 있다 - web scrapingproxying. 스크래퍼는 웹페이지를 다운로드하고 계획에 따라 그것으로부터 정보를 추출하는 소프트웨어이다. 프록시 서버는 다른 서버에게 클라이언트의 요청을 전달하고 응답을 반환해주는 중개인과 같은 역할을 한다.

The Request Module

Node.js에서 HTTP 요청을 만드는 가장 간단한 방법은 request 모듈을 사용하는 것이다. Mikeal Rogers가 만든 request 모듈은 GET, POST, PUT, 그리고 DELETE를 포함한 모든 유형의 HTTP 요청을 만들게 해준다. 그러한 유연성이 request 모듈을 RESTful APIs로 상호작용하기에 적합하게 만든다. 다음의 npm 명령을 사용해서 request 모듈을 설치할 수 있다.

$ npm install request

request가 설치되었다면 아래 보이는 코드로 새로운 Node.js 파일을 만들어보자. 예제의 첫번째 라인에서 request 모듈을 프로그램 안으로 임포트하였다. HTTP 요청을 만드는 것은 간단하게 request() 함수를 호출하면 된다. 이 예제에서 우리는 sitepoint 홈페이지를 다운로드하기 위해 요청을 하고 있다. 물론, request()의 두번째 인자는 콜백 함수이다.

var request = require("request");
request("http://www.sitepoint.com", function(error, response, body) {
  console.log(body);
});

request()의 콜백 함수는 세개의 인자를 받는다 - error, response, 그리고 body. 이름을 보면 알수 있듯이 error는 HTTP 요청 중 발생하는 모든 문제에 관한 정보를 포함하고 있다. response 인자는 호출에 대해 반환되는 상태코드, 헤더 등 많은 것들을 포함한 다양한 데이터를 가지고 있는 객체이다. 세번째 인자인 body는 응답의 body이다. 앞의 예제에서 body는 sitepoint 홈페이지의 소스 코드를 포함하고 있다.

request 모듈은 HTTP 요청을 파일로 그리고 파일로부터 스트림하기 위해 파일 시스템 모듈과 결합을 할수도 있다. 다음 예제도 sitepoint 홈페이지를 가져 오는 것이다. 하지만, 콘솔에 소스코드를 보여주는 대신에 “sitepoint.htm”이라는 파일로 저장한다.

var request = require("request");
var fs = require("fs");
request("http://www.sitepoint.com").pipe(fs.createWriteStream("sitepoint.htm"));

Parameterizing Requests

앞의 예제들은 URL에 대해 간단한 GET 요청을 만들고 있다. 하지만 우리는 request()의 첫번째 인자로 설정 객체를 전달함으로써 HTTP 요청을 수정할 수 있다. 아래 예제 역시 sitepoint 홈페이지를 다운로드하는 것이지만 더 강력한 구문을 사용하고 있다. 숫자형의 설정 파라미터에 주의해야 하며 urimethod 파라미터는 sitepoint에 GET 요청을 보내라고 request에게 알려준다.

var request = require("request");
request({
  uri: "http://www.sitepoint.com",
  method: "GET",
  timeout: 10000,
  followRedirect: true,
  maxRedirects: 10
}, function(error, response, body) {
  console.log(body);
});

timeout 파라미터는 응답을 포기하기전에 10,000 밀리초(10초)동안 기다리라고 request에게 알려주는 것이며, 마지막 두개의 파라미터는 리다이렉션 처리를 해준다. 많은 페이지들이 사용자가 인식하지 못하는 사이에 보이지 않게 리다이렉션을 수행한다. followRedirectmaxRedirects 파라미터는 3xx HTTP 리다이렉션을 최대 10개까지 처리하라고 request에게 알려준다. 또한, request()는 여기에서 보여주지 않은 다른 많은 파라미터들을 지원한다.

Submitting Form Data

앞에서 언급했듯이 requestGET 요청뿐만 아니라 더 많은 것을 지원한다. 아주 일반적인것 중 하나가 POST 요청을 사용하여 폼 데이터를 제출하는 것이다. 다음 예제는 POST의 한 부분으로 사용자의 이름을 전송하기 위해서 request()form 파라미터를 사용한다. 그러면 PHP 페이지가 사용자에게 응답을 하는데 전송한 이름으로 인사 메시지를 보여줄 것이다.

var request = require("request");
request({
  uri: "http://www.cjihrig.com/development/php/hello_form.php",
  method: "POST",
  form: {
    name: "Bob"
  }
}, function(error, response, body) {
  console.log(body);
});

Dealing with Cookies

많은 사이트들이 쿠키를 사용해서 사용자와의 다양한 상호작용을 추적한다. 쿠키는 모든 HTTP 전송간에 클라이언트와 서버 사이에서 왔다 갔다 전송되는 작은 데이터 조각들이다. 쿠키의 사용을 용이하게 하기 위해서 requestjar()cookie() 메서드를 제공한다. 다음 예제의 3 라인을 보면 사용자의 이름을 명시한 쿠키를 생성했다. 그 다음 2 라인에서 생성한 cookie jar에 그 쿠키를 추가했다. HTTP 요청을 만들때 jar 파라미터는 서버에 cookie jar를 전송하기 위해 사용된다.

var request = require("request");
var jar = request.jar();
var cookie = request.cookie("name=John");
jar.add(cookie);
request({
  uri: "http://www.cjihrig.com/development/php/hello_cookies.php",
  method: "GET",
  jar: jar
}, function(error, response, body) {
  console.log(body);
});

응답을 받게 될 때 사용자는 쿠키에 저장되어 있던 이름인 John으로 인사 메시지를 받을 것이다. cookie jar는 또한 서버에 의한 어떤 변화에도 업데이트가 된다. 요청을 보내기 전과 후에 cookie jar를 출력해 보면, 서버가 쿠키의 값을 “John”에서 “Stranger”로 변경한 것을 알 수 있다. 사이트와 사용자간에 실제 상호작용을 묘사하기 위해서 같은 cookie jar를 HTTP 요청에 연속으로 보낼수 있다.

Conclusion

이번 글에서는 간단하지만 강력한 request 모듈에 대해서 소개를 했다. 이번 글이 포괄적이지는 않기 때문에 request가 할 수 있는 다른 것들을 알아보기 위해서는 최소한의 문서들을 검색해봐야 할 것이다. 곧 나올 글에서 request를 더 심도있게 사용한 웹 스크래핑에 대해서 다룰 계획이니 계속 지켜봐 주길 바란다.


About Author

Juhoi Kim
blog: http://juhoi.github.io
twitter: @ByJuhoi
github: juhoi

모든 것은 나의 선택에 달려있다.