{"id":703,"date":"2020-08-03T21:00:01","date_gmt":"2020-08-03T12:00:01","guid":{"rendered":"http:\/\/mobilelab.khu.ac.kr\/?p=703"},"modified":"2020-04-05T19:10:21","modified_gmt":"2020-04-05T10:10:21","slug":"be-dart-programmer-29","status":"publish","type":"post","link":"http:\/\/mobilelab.khu.ac.kr\/wordpress\/2020\/08\/03\/be-dart-programmer-29\/","title":{"rendered":"Dart Programmer \ub418\uae30 [29]"},"content":{"rendered":"\n<h4>&lt; HTTP \uc11c\ubc84\uac1c\ubc1c &#8211; HTTP Client Development &gt;<\/h4>\n\n\n\n<p>darttutorial-28-01.dart \ud504\ub85c\uadf8\ub7a8\uae4c\uc9c0 \uc6b0\ub9ac\ub294 HTTP Server\ub97c \ub9cc\ub4e4\uace0, \uc774\uc5d0 \uc811\uc18d\ud558\ub294 \ubc29\ubc95\uc73c\ub85c \uc6f9\ube0c\ub77c\uc6b0\uc800\ub97c \uc0ac\uc6a9\ud588\uc2b5\ub2c8\ub2e4. Dart \uc5b8\uc5b4\ub85c HTTP Server\ub97c \ub9cc\ub4e4\uc5c8\ub2e4\uba74, \ub2f9\uc5f0\ud788 HTTP Client\ub3c4 \ub9cc\ub4e4\uc218 \uc788\uac8c\ub2e4\ub294 \uc0dd\uac01\uc774 \ub4e4\uaca0\uc9c0\uc694. \ubcf8 \uae00\uc5d0\uc11c\ub294 Dart \uc5b8\uc5b4\ub97c \ud1b5\ud574\uc11c darttutorial-28-01.dart\uc5d0 \uc811\uc18d\ud558\uc5ec HTTP GET, HTTP GET RESTful, HTTP POST\ub97c \uc218\ud589\ud558\ub294 \ud504\ub85c\uadf8\ub7a8\uc744 \ub9cc\ub4e4\uace0\uc790 \ud569\ub2c8\ub2e4. <\/p>\n\n\n\n<h4>Simple HTTP Client<\/h4>\n\n\n\n<p>\uc0c1\ub2f9\ubd80\ubd84\uc774 HTTP Server\ub97c \ub9cc\ub4e4\ub54c \uc0ac\uc6a9\ud55c \uc0ac\ud56d\uacfc \uacb9\uce58\uac70\ub098 \uc720\uc0ac\ud569\ub2c8\ub2e4. \ub530\ub77c\uc11c Dart\ub85c \ub9cc\ub4e0 HTTP Client\uc758 \uc18c\uc2a4 \ucf54\ub4dc\ub97c \uc544\ub798\uc758 darttutorial-29-01.dart\uc73c\ub85c \ucca8\ubd80\ud558\uc600\uc73c\ub2c8 \uba3c\uc800 \uc2dc\uc791\ubd80\ud130 \ub05d\uae4c\uc9c0 \uc77d\uc5b4 \ubcf4\uae30 \ubc14\ub78d\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ darttutorial-29-01.dart\n\nimport \"dart:io\";\nimport \"dart:convert\";\n\nFuture main() async {\n  \/\/ #1 Create HttpRequest &amp; HttpResponse objects \n  HttpClientRequest httpRequest;\n  HttpClientResponse httpResponse;\n\n  \/\/ #2 Create HTTP server network information related objects\n  var serverIP = InternetAddress.loopbackIPv4.host;\n  var serverPort = 4049;\n  var serverPath;\n\n  \/\/ #3 Get request transfer example\n  stdout.writeln('${DateTime.now()}: Send GET');\n  serverPath = \"\";\n  httpRequest = await HttpClient().get (serverIP, serverPort, serverPath);\n  httpResponse = await httpRequest.close();\n  await utf8.decoder.bind(httpResponse).forEach(print);\n\n  \/\/ #4 Get request transfer with RESTful example\n  stdout.writeln('${DateTime.now()}: Send GET RESTful');\n  serverPath = '?q=4&amp;p=5.0&amp;r=\"Dart\"';\n  httpRequest = await HttpClient().get (serverIP, serverPort, serverPath);\n  httpResponse = await httpRequest.close();\n  await utf8.decoder.bind(httpResponse).forEach(print);\n\n  \/\/ #5 POST request transfer with JSON data example\n  stdout.writeln('${DateTime.now()}: Send POST JSON');\n\n  Map jsonContent  ={\n    'C++' : 'Bjarne Stroustrup',\n    'Dart' : 'Lars Bak and Kasper Lund',\n    'Go' : 'Robert Griesemer, Rob Pike, Ken Thompson',\n    'JavaScript' : 'Brendan Eich'\n  };\n\n  serverPath = \"bin\/example.txt\";\n  httpRequest = await HttpClient().post (serverIP, serverPort, serverPath)\n  ..headers.contentType = ContentType.json\n  ..write(jsonEncode(jsonContent));\n  httpResponse = await httpRequest.close();\n  await utf8.decoder.bind(httpResponse).forEach(print);\n}<\/code><\/pre>\n\n\n\n<p>\uc774\uc81c Dart\ub85c \ub9cc\ub4e0 HTTP Client\ub97c \uccab\uc904\ubd80\ud130 \ud55c\uc904\ud55c\uc904 \uc138\uc138\ud558\uac8c \uc124\uba85\uc744 \ud558\uace0\uc790 \ud569\ub2c8\ub2e4. \uc774\ub97c \uc704\ud574\uc11c \uac01\uac01\uc758 \uc904\uc5d0 \uc904\ubc88\ud638\ub97c \ub9e4\uae34 \ub2e4\uc74c\uc758 \uadf8\ub9bc\uc744 \uc0ac\uc6a9\ud569\ub2c8\ub2e4. \ub0b4\uc6a9\uc744 \uc55e\uc11c\uc758 darttutorial-29-01.dart\uc640 \ub3d9\uc77c\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" loading=\"lazy\" width=\"686\" height=\"1024\" src=\"http:\/\/mobilelab.khu.ac.kr\/wordpress\/wp-content\/uploads\/2020\/02\/a-686x1024.png\" alt=\"\" class=\"wp-image-717\" srcset=\"http:\/\/mobilelab.khu.ac.kr\/wordpress\/wp-content\/uploads\/2020\/02\/a-686x1024.png 686w, http:\/\/mobilelab.khu.ac.kr\/wordpress\/wp-content\/uploads\/2020\/02\/a-201x300.png 201w, http:\/\/mobilelab.khu.ac.kr\/wordpress\/wp-content\/uploads\/2020\/02\/a-480x717.png 480w, http:\/\/mobilelab.khu.ac.kr\/wordpress\/wp-content\/uploads\/2020\/02\/a.png 707w\" sizes=\"(max-width: 686px) 100vw, 686px\" \/><figcaption>[\uadf8\ub9bc] darttutorial-29-01.dart \uc18c\uc2a4 \ud504\ub85c\uadf8\ub7a8<\/figcaption><\/figure>\n\n\n\n<p>3~4\ubc88 \uc904\uc744 \ubcf4\uba74 \uc790\uc8fc \uc0ac\uc6a9\ud588\ub358 dart:io\uc640 dart:convert\ub97c \uc0ac\uc6a9\ud569\ub2c8\ub2e4. dart:io\ub97c \ud1b5\ud574\uc11c \uc11c\ubc84\uc640 \ub3d9\uc77c\ud558\uac8c \ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0\uc11c\uc758 HTTP \ucc98\ub9ac\ub97c \ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<p>8~9\ubc88 \uc904\uc740 HTTP Client\uc5d0\uc11c HTTP Request\uc640 HTTP Response\ub97c \ucc98\ub9ac\ud558\uae30 \uc704\ud55c \uac1d\uccb4\ub97c \uac01\uac01 HttpClientRequest\uc640 HttpClientResponse \ud074\ub798\uc2a4\ub4e4\ub85c\ubd80\ud130 \ub9cc\ub4dc\ub294 \uac83\uc744 \ubcfc \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<p>12~13\ubc88 \uc904\uc740 HTTP \uc11c\ubc84\uc758 \ub124\ud2b8\uc6cc\ud06c \uc8fc\uc18c\uc640 \ud3ec\ud2b8\ubc88\ud638\ub97c \uc800\uc7a5\ud558\uae30 \uc704\ud568\uc774\uba70, \uc11c\ubc84 \uac1c\ubc1c\uc5d0\uc11c\ub3c4 \ub3d9\uc77c\ud55c \ucf54\ub4dc\uac00 \uc788\uc5c8\uc2b5\ub2c8\ub2e4. 14\ubc88 \uc904\uc740 GET\uc744 \ud1b5\ud574\uc11c \ud654\uc77c(\ud639\uc740 \uacbd\ub85c\uba85\uacfc \ud654\uc77c)\uc774\ub098 RESTful\ub97c \ud1b5\ud574\uc11c \ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0\uc11c \uc11c\ubc84\ub85c \uc804\ub2ec\ud558\ub294 \uc815\ubcf4\ub97c  \uc800\uc7a5\ud558\ub294 \uc6a9\ub3c4\ub85c \ub9cc\ub4e4\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<p>#3\uc758 \ubd80\ubd84\uc774 \uc55e\uc11c \uac00\uc7a5 \uac04\ub2e8\ud55c \ud615\ud0dc\uc758 Simple &#8220;Hello World!&#8221; HTTP Server\uc758 \uc791\uc5c5\uc744 \uc694\uccad\ud558\uae30 \uc704\ud55c \uc6a9\ub3c4\uc785\ub2c8\ub2e4. \uc989, \ub2e8\uc21c\ud558\uac8c GET \uba54\uc2dc\uc9c0\ub9cc \ub9cc\ub4e4\uc5b4\uc11c \uc11c\ubc84\uc5d0 \uc804\ub2ec\ud588\uc2b5\ub2c8\ub2e4. 20\ubc88 \uc904\uc5d0\uc11c, \uc11c\ubc84\uc5d0\uc11c \ubcf8 \uacbd\uc6b0\uc640 \ub3d9\uc77c\ud558\uac8c, HttpRequest \uac1d\uccb4\ub97c close()\ud558\uba74, \ud574\ub2f9 \uac1d\uccb4\uac00 Stream \uac1d\uccb4\ub85c\uc11c \uba54\uc2dc\uc9c0\ub97c \ub9cc\ub4e4\uc5b4\uc11c \uc804\uc1a1\ud558\ub294 \ud6a8\uacfc\uac00 \ub098\ud0c0\ub0a9\ub2c8\ub2e4. \uc774\uc758 \uacb0\uacfc\ub97c \ube44\ub3d9\uae30\uc2dd\uc73c\ub85c \uae30\ub2e4\ub838\ub2e4\uac00 httpResponse \uac1d\uccb4\uc5d0 \ub2f4\ub294 \uac83\uc744 \ubcfc \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub294 \uc11c\ubc84\uc5d0\uc11c\ub294 \uc5c6\uc5c8\ub358 \uac83\uc73c\ub85c, HTTP Client\uac00 \uc11c\ubc84\ub85c\ubd80\ud130\uc758 \ub2f5\ubcc0\uc744 \ubc1b\uc544 \uc800\uc7a5\ud55c \uac83\uc785\ub2c8\ub2e4. \ub9c8\uc9c0\ub9c9 21\ubc88 \uc904\uc5d0\uc11c\ub294  utf8.decoder.bind(httpResponse) \ucc98\ub7fc \ud558\uc5ec, \uc11c\ubc84\uc5d0\uc11c\uc640 \uac19\uc774 \uc11c\ubc84\ub85c\ubd80\ud130 \uc628 \ub2f5\ubcc0\uc744 \ubaa8\uc73c\uace0 UTF-8\ub85c \ubcc0\ud658\ud569\ub2c8\ub2e4. \uadf8\ub9ac\uace0 \uc774\uc5d0 \ub300\ud55c \uacb0\uacfc\ub97c forEach(print);\ub97c \ud1b5\ud574\uc11c \ud654\uba74\uc5d0 \ucd9c\ub825\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<p>#4\ub3c4 #3\uacfc \ubaa8\ub450 \ub3d9\uc77c\ud558\uba70, \uc720\uc77c\ud558\uac8c 25\ubc88 \uc904\uc5d0\uc11c \uacbd\ub85c\uc758 \uac12\uc744 RESTful\uc758 \ud615\ud0dc\ub85c \uc800\uc7a5\ud560 \ubcc0\uc218\uc640 \uac12\ub4e4\ub85c \ub9cc\ub4e4\uc5b4\uc11c \uc804\ub2ec\ud569\ub2c8\ub2e4. \uc774\ud6c4 \uc11c\ubc84\uc758 \ub3d9\uc791\uc744 \ubcf4\uba74, RESTful \uc815\ubcf4\uac00 \uc81c\ub300\ub85c \ubd84\ub9ac\ub418\uc5b4 \uc778\uc2dd\ub418\ub294 \uac83\uc744 \ubcfc \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<p>#5\ub294 JSON \ud0c0\uc785\uc73c\ub85c Map \uc815\ubcf4\ub97c \ubcf4\ub0b4\ub294 \uc608\uc81c\uc785\ub2c8\ub2e4. 33~38\ubc88 \uc904\uc744 \ud1b5\ud574\uc11c Map\uc73c\ub85c 4\uac00\uc9c0 \ud504\ub85c\uadf8\ub798\ubc0d \uc5b8\uc5b4\uc640 \uc774\ub4e4\uc758 \uc800\uc790\ub97c Map\uc73c\ub85c \ub9cc\ub4e4\uc5c8\uc2b5\ub2c8\ub2e4. 41\ubc88 \uc904\uc5d0\uc11c \uc804\uc1a1\ud560 \uba54\uc2dc\uc9c0\uac00 post \uc784\uc73c\ub85c \ubc14\ub00c\uc5c8\uc2b5\ub2c8\ub2e4. \uadf8\ub9ac\uace0 \uc8fc\uc758 \uae4a\uac8c \ubd10\uc57c\ud560 \ubd80\ubd84\uc740 42\/43\ubc88 \uc904 \uc785\ub2c8\ub2e4. 42\ubc88 \uc904\uc740 \uc804\ub2ec\ud558\ub294 \ub370\uc774\ud0c0\uac00 JSON \ud0c0\uc785\uc784\uc744 \uba85\uc2dc\ud558\uc600\uc2b5\ub2c8\ub2e4. \uadf8\ub9ac\uace0 43\ubc88 \uc904\uc5d0\uc11c Map \uc815\ubcf4\ub97c JSON \ucf54\ub529 \ud0c0\uc785\uc73c\ub85c \ubcc0\ud658\ud6c4, \uc804\uc1a1\ud560 \uba54\uc2dc\uc9c0\uc5d0 \uc800\uc7a5\ud574 \ub2ec\ub77c\uace0 \uc694\uccad\ud588\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<h4>HTTP Client &amp; Server Execution<\/h4>\n\n\n\n<p>darttutorial-28-01.dart \uc11c\ubc84\ub97c \uc218\ud589\ud55c \ud6c4, darttutorial-29-01.dart \ud504\ub85c\uadf8\ub7a8\uc744 \uc218\ud589\ud558\uba74, \uc11c\ubc84\uc5d0\uc11c\uc758 \ucd9c\ub825\uc744 \ub2e4\uc74c\uacfc \uac19\uc774 \ubcfc \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc6f9\ube0c\ub77c\uc6b0\uc800\ub97c \ud1b5\ud574\uc11c \uc218\ud589\ud55c \uac83\uacfc \uac19\uc740 \uacb0\uacfc\uac00 \ub098\ud0c0\ub0a9\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>2020-02-14 17:29:00.679269: GET {}\n2020-02-14 17:29:00.716868: GET {q: 4, p: 5.0, r: \"Dart\"}\n2020-02-14 17:29:00.735167: POST \/bin\/example.txt<\/code><\/pre>\n\n\n\n<p>darttutorial-29-01.dart \ud504\ub85c\uadf8\ub7a8\uc758 \uc218\ud589 \uacb0\uacfc\uac00 \uc544\ub798\uc640 \uac19\uc774 \uc788\uc2b5\ub2c8\ub2e4. 3\uac00\uc9c0 \ucf00\uc774\uc2a4\uc5d0 \ub300\ud55c \uc218\ud589 \uacb0\uacfc\uac00 \ud558\ub098 \ud558\ub098 \uc2e4\ud589\ub418\uba74\uc11c \ud654\uba74\uc5d0 \ucd9c\ub825\ub418\ub294 \ubaa8\uc2b5\uc744 \ubcfc \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>2020-02-14 17:29:00.590662: Send GET\n2020-02-14 17:29:00.679541: Hello World!\n2020-02-14 17:29:00.713488: Send GET RESTful\n2020-02-14 17:29:00.717095: Hello World!\n2020-02-14 17:29:00.721787: Send POST JSON\n2020-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}.<\/code><\/pre>\n\n\n\n<h4>\ub9c8\ubb34\ub9ac<\/h4>\n\n\n\n<p>\uac04\ub2e8\ud558\uac8c \ub098\ub9c8 HTTP Client\ub97c \uc9c1\uc811 Dart \uc5b8\uc5b4\ub85c \ub9cc\ub4e4\uc5b4 \ubcf4\uc558\uc2b5\ub2c8\ub2e4. \ub300\ubd80\ubd84\uc758 \ud568\uc218\uc640 \uae30\ub2a5\uc774 \uc11c\ubc84\uc758 \uacbd\uc6b0\uc640 \ube44\uc2b7\ud55c \uac83\uc744 \ubcfc \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ubb3c\ub860 dart:io \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \ub3d9\uc77c\ud558\uac8c \uc0ac\uc6a9\ud55c \uac83\ub3c4 \ubcfc\uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc124\uba85\ud55c \ub0b4\uc6a9\uc740 \ud5a5\ud6c4 \uc2a4\ub9c8\ud2b8\ud3f0\uacfc \uac19\uc740 \ubaa8\ubc14\uc77c \uae30\uae30\uc5d0\uc11c \ub3d9\uc791\ud558\ub294 \ud504\ub85c\uadf8\ub7a8\uc744 \uc791\uc131\ud560 \ub54c \ub2e4\uc2dc \ub4f1\uc7a5\ud560 \ub0b4\uc6a9\uc774\ub2c8 \ucc38\uc870\ud558\uae30 \ubc14\ub78d\ub2c8\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"alignright is-resized\"><img decoding=\"async\" loading=\"lazy\" src=\"http:\/\/mobilelab.khu.ac.kr\/wordpress\/wp-content\/uploads\/2020\/01\/b05-1.jpg\" alt=\"\" class=\"wp-image-267\" width=\"132\" height=\"47\"\/><\/figure><\/div>\n\n\n\n<p><strong>Creative Commons License<\/strong> (<strong>CC BY-NC-ND<\/strong>)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>&lt; HTTP \uc11c\ubc84\uac1c\ubc1c &#8211; HTTP Client Development &gt; darttutorial-28-01.dart \ud504\ub85c\uadf8\ub7a8\uae4c\uc9c0 \uc6b0\ub9ac\ub294 HTTP Server\ub97c \ub9cc\ub4e4\uace0, \uc774\uc5d0 \uc811\uc18d\ud558\ub294 \ubc29\ubc95\uc73c\ub85c \uc6f9\ube0c\ub77c\uc6b0\uc800\ub97c \uc0ac\uc6a9\ud588\uc2b5\ub2c8\ub2e4. Dart \uc5b8\uc5b4\ub85c HTTP Server\ub97c \ub9cc\ub4e4\uc5c8\ub2e4\uba74, \ub2f9\uc5f0\ud788 HTTP Client\ub3c4 \ub9cc\ub4e4\uc218 \uc788\uac8c\ub2e4\ub294 \uc0dd\uac01\uc774 &#8230;<\/p>\n","protected":false},"author":1,"featured_media":981,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0},"categories":[3],"tags":[14],"aioseo_notices":[],"_links":{"self":[{"href":"http:\/\/mobilelab.khu.ac.kr\/wordpress\/wp-json\/wp\/v2\/posts\/703"}],"collection":[{"href":"http:\/\/mobilelab.khu.ac.kr\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/mobilelab.khu.ac.kr\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/mobilelab.khu.ac.kr\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/mobilelab.khu.ac.kr\/wordpress\/wp-json\/wp\/v2\/comments?post=703"}],"version-history":[{"count":6,"href":"http:\/\/mobilelab.khu.ac.kr\/wordpress\/wp-json\/wp\/v2\/posts\/703\/revisions"}],"predecessor-version":[{"id":982,"href":"http:\/\/mobilelab.khu.ac.kr\/wordpress\/wp-json\/wp\/v2\/posts\/703\/revisions\/982"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/mobilelab.khu.ac.kr\/wordpress\/wp-json\/wp\/v2\/media\/981"}],"wp:attachment":[{"href":"http:\/\/mobilelab.khu.ac.kr\/wordpress\/wp-json\/wp\/v2\/media?parent=703"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/mobilelab.khu.ac.kr\/wordpress\/wp-json\/wp\/v2\/categories?post=703"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/mobilelab.khu.ac.kr\/wordpress\/wp-json\/wp\/v2\/tags?post=703"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}