Dart Programmer 되기 [29]

< HTTP 서버개발 – HTTP Client Development >

darttutorial-28-01.dart 프로그램까지 우리는 HTTP Server를 만들고, 이에 접속하는 방법으로 웹브라우저를 사용했습니다. Dart 언어로 HTTP Server를 만들었다면, 당연히 HTTP Client도 만들수 있게다는 생각이 들겠지요. 본 글에서는 Dart 언어를 통해서 darttutorial-28-01.dart에 접속하여 HTTP GET, HTTP GET RESTful, HTTP POST를 수행하는 프로그램을 만들고자 합니다.

Simple HTTP Client

상당부분이 HTTP Server를 만들때 사용한 사항과 겹치거나 유사합니다. 따라서 Dart로 만든 HTTP Client의 소스 코드를 아래의 darttutorial-29-01.dart으로 첨부하였으니 먼저 시작부터 끝까지 읽어 보기 바랍니다.

// darttutorial-29-01.dart

import "dart:io";
import "dart:convert";

Future main() async {
  // #1 Create HttpRequest & HttpResponse objects 
  HttpClientRequest httpRequest;
  HttpClientResponse httpResponse;

  // #2 Create HTTP server network information related objects
  var serverIP = InternetAddress.loopbackIPv4.host;
  var serverPort = 4049;
  var serverPath;

  // #3 Get request transfer example
  stdout.writeln('${DateTime.now()}: Send GET');
  serverPath = "";
  httpRequest = await HttpClient().get (serverIP, serverPort, serverPath);
  httpResponse = await httpRequest.close();
  await utf8.decoder.bind(httpResponse).forEach(print);

  // #4 Get request transfer with RESTful example
  stdout.writeln('${DateTime.now()}: Send GET RESTful');
  serverPath = '?q=4&p=5.0&r="Dart"';
  httpRequest = await HttpClient().get (serverIP, serverPort, serverPath);
  httpResponse = await httpRequest.close();
  await utf8.decoder.bind(httpResponse).forEach(print);

  // #5 POST request transfer with JSON data example
  stdout.writeln('${DateTime.now()}: Send POST JSON');

  Map jsonContent  ={
    'C++' : 'Bjarne Stroustrup',
    'Dart' : 'Lars Bak and Kasper Lund',
    'Go' : 'Robert Griesemer, Rob Pike, Ken Thompson',
    'JavaScript' : 'Brendan Eich'
  };

  serverPath = "bin/example.txt";
  httpRequest = await HttpClient().post (serverIP, serverPort, serverPath)
  ..headers.contentType = ContentType.json
  ..write(jsonEncode(jsonContent));
  httpResponse = await httpRequest.close();
  await utf8.decoder.bind(httpResponse).forEach(print);
}

이제 Dart로 만든 HTTP Client를 첫줄부터 한줄한줄 세세하게 설명을 하고자 합니다. 이를 위해서 각각의 줄에 줄번호를 매긴 다음의 그림을 사용합니다. 내용을 앞서의 darttutorial-29-01.dart와 동일합니다.

[그림] darttutorial-29-01.dart 소스 프로그램

3~4번 줄을 보면 자주 사용했던 dart:io와 dart:convert를 사용합니다. dart:io를 통해서 서버와 동일하게 클라이언트에서의 HTTP 처리를 합니다.

8~9번 줄은 HTTP Client에서 HTTP Request와 HTTP Response를 처리하기 위한 객체를 각각 HttpClientRequest와 HttpClientResponse 클래스들로부터 만드는 것을 볼 수 있습니다.

12~13번 줄은 HTTP 서버의 네트워크 주소와 포트번호를 저장하기 위함이며, 서버 개발에서도 동일한 코드가 있었습니다. 14번 줄은 GET을 통해서 화일(혹은 경로명과 화일)이나 RESTful를 통해서 클라이언트에서 서버로 전달하는 정보를 저장하는 용도로 만들었습니다.

#3의 부분이 앞서 가장 간단한 형태의 Simple “Hello World!” HTTP Server의 작업을 요청하기 위한 용도입니다. 즉, 단순하게 GET 메시지만 만들어서 서버에 전달했습니다. 20번 줄에서, 서버에서 본 경우와 동일하게, HttpRequest 객체를 close()하면, 해당 객체가 Stream 객체로서 메시지를 만들어서 전송하는 효과가 나타납니다. 이의 결과를 비동기식으로 기다렸다가 httpResponse 객체에 담는 것을 볼 수 있습니다. 이는 서버에서는 없었던 것으로, HTTP Client가 서버로부터의 답변을 받아 저장한 것입니다. 마지막 21번 줄에서는 utf8.decoder.bind(httpResponse) 처럼 하여, 서버에서와 같이 서버로부터 온 답변을 모으고 UTF-8로 변환합니다. 그리고 이에 대한 결과를 forEach(print);를 통해서 화면에 출력합니다.

#4도 #3과 모두 동일하며, 유일하게 25번 줄에서 경로의 값을 RESTful의 형태로 저장할 변수와 값들로 만들어서 전달합니다. 이후 서버의 동작을 보면, RESTful 정보가 제대로 분리되어 인식되는 것을 볼 수 있습니다.

#5는 JSON 타입으로 Map 정보를 보내는 예제입니다. 33~38번 줄을 통해서 Map으로 4가지 프로그래밍 언어와 이들의 저자를 Map으로 만들었습니다. 41번 줄에서 전송할 메시지가 post 임으로 바뀌었습니다. 그리고 주의 깊게 봐야할 부분은 42/43번 줄 입니다. 42번 줄은 전달하는 데이타가 JSON 타입임을 명시하였습니다. 그리고 43번 줄에서 Map 정보를 JSON 코딩 타입으로 변환후, 전송할 메시지에 저장해 달라고 요청했습니다.

HTTP Client & Server Execution

darttutorial-28-01.dart 서버를 수행한 후, darttutorial-29-01.dart 프로그램을 수행하면, 서버에서의 출력을 다음과 같이 볼 수 있습니다. 웹브라우저를 통해서 수행한 것과 같은 결과가 나타납니다.

2020-02-14 17:29:00.679269: GET {}
2020-02-14 17:29:00.716868: GET {q: 4, p: 5.0, r: "Dart"}
2020-02-14 17:29:00.735167: POST /bin/example.txt

darttutorial-29-01.dart 프로그램의 수행 결과가 아래와 같이 있습니다. 3가지 케이스에 대한 수행 결과가 하나 하나 실행되면서 화면에 출력되는 모습을 볼 수 있습니다.

2020-02-14 17:29:00.590662: Send GET
2020-02-14 17:29:00.679541: Hello World!
2020-02-14 17:29:00.713488: Send GET RESTful
2020-02-14 17:29:00.717095: Hello World!
2020-02-14 17:29:00.721787: Send POST JSON
2020-02-14 17:29:00.737065: Wrote data for {C++: Bjarne Stroustrup, Dart: Lars Bak and Kasper Lund, Go: Robert Griesemer, Rob Pike, Ken Thompson, JavaScript: Brendan Eich}.

마무리

간단하게 나마 HTTP Client를 직접 Dart 언어로 만들어 보았습니다. 대부분의 함수와 기능이 서버의 경우와 비슷한 것을 볼 수 있습니다. 물론 dart:io 라이브러리를 동일하게 사용한 것도 볼수 있습니다. 설명한 내용은 향후 스마트폰과 같은 모바일 기기에서 동작하는 프로그램을 작성할 때 다시 등장할 내용이니 참조하기 바랍니다.

Creative Commons License (CC BY-NC-ND)

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다