Github 코드 주소입니다.
https://github.com/ac9831/dart_client_project
Dart 언어에서는 지원하는 통신 기술이 있습니다.
대표적인 Package로 'dart:io'가 있죠. 또한 통신을 위해 Encoding과 Decoding이 필요합니다. 해당 기능을 지원하는 Package로 'dart:convert' 가 있습니다.
먼저 클라이언트에서 요청을 보낼 수 있는 코드부터 작성해 보겠습니다.
Client 개발
import 'dart:io';
import 'dart:convert';
io와 convert를 이용하기 위해 import를 합니다.
host와 path용 String을 정의해봅니다.
String _host = InternetAddress.loopbackIPv4.host;
String path = 'site/file.txt';
전달할 json 데이터도 선언해 보겠습니다.
Map jsonData = {
'name': 'GunJun',
'job': 'Developer',
'BFF': 'Chewbacca',
'ship': 'Millennium Falcon',
'weakness': 'smuggling debts'
};
Map은 key와 value로 구성된 자료구조입니다. 다른 언어에서도 흔히 사용하고 있는 자료구조로 json Data로는 적합합니다.
main 함수를 정의해서 전송을 해보도록 하겠습니다.
Future main() async {
HttpClientRequest request = await HttpClient().post(_host, 4040, path)
..headers.contentType = ContentType.json
..write(jsonEncode(jsonData));
HttpClientResponse response = await request.close();
await utf8.decoder.bind(response).forEach(print);
HttpClientRequest requestGet = await HttpClient().get(_host, 4040, path);
HttpClientResponse responseGet = await requestGet.close();
await utf8.decoder.bind(responseGet).forEach(print);
HttpClientRequest requestPut = await HttpClient().put(_host, 4040, '');
HttpClientResponse responsePut = await requestPut.close();
await utf8.decoder.bind(responsePut).forEach(print);
}
코드가 많군요. 하나씩 살펴 보도록 하겠습니다.
Future는 Dart에서 비동기 처리를 할 때 사용하는 반환값입니다. 비동기 처리는 동기와는 다르게 처리가 순서대로 끝나는 것이 아니기 때문에 미래에 결과값을 반환한다고 생각합니다. 그런의미에서 Future라는 값을 반환하며 main() 옆에 있는 async와 함께 사용될 수 있습니다. Future는 'dart:async'에 포함되어 있는 기능입니다.
코드를 나눠보겠습니다.
HttpClientRequest request = await HttpClient().post(_host, 4040, path)
..headers.contentType = ContentType.json
..write(jsonEncode(jsonData));
HttpClientResponse response = await request.close();
await utf8.decoder.bind(response).forEach(print);
위 코드는 HttpClient()를 통해 요청을 보내는 코드입니다.
post 메소드를 통해 Request를 만들어줍니다. post의 파라미터는 1. 요청 주소 2. 포트번호. 3. 요청 주소 뒤에 붙는 나머지 주소입니다.
".."은 케스케이드 표기법으로 동일한 객체에서 일련의 작업을 수행할 수 있습니다. 예를 들어 위 코드를 풀어서 쓰면 아래와 같습니다.
HttpClient().post().headers.contentType = ContentType.json;
HttpClient().post().write(JsonEncode(jsonData));
post 요청에 대한 header 설정이 끝나고 마지막에 write를 호출했습니다. jsonEncode를 통해 요청 body에 쓰는 함수입니다.
HttpClientResponse에 request.close()를 통해 request를 요청한 후 서버에서 response를 주는 과정까지 해당 라인에서 처리됩니다.
await를 통해 스레드를 독점하지 않고, 처리가 완료되면 다음 라인으로 넘어갑니다.
utf8.decoder.bind를 통해 전달받은 데이터를 decoding하고, forEach문 안에서 print를 통해 데이터를 출력하게 됩니다.
HttpClientRequest requestGet = await HttpClient().get(_host, 4040, path);
HttpClientResponse responseGet = await requestGet.close();
await utf8.decoder.bind(responseGet).forEach(print);
get 요청은 post와는 다르게 write를 하지 않으며, 상대적으로 간단하게 요청을 할 수 있습니다. query string의 경우 path에 함께 포함시켜 주시면 서버에서 처리할 수 있습니다.
HttpClientRequest requestPut = await HttpClient().put(_host, 4040, '');
HttpClientResponse responsePut = await requestPut.close();
await utf8.decoder.bind(responsePut).forEach(print);
put 요청의 경우 다른 요청은 넣지 않았으며, 서버에서는 없는 요청으로 처리하기 위해 테스트 코드로 추가했습니다.
결과는 아래와 같이 나옵니다.
마지막 에러는 서버에 Put를 안만들어줘서 나온 에러이며, 일부러 그렇게 작성했습니다. 2화에서는 서버 코드를 살펴보겠습니다.
Dart로 Server와 Cleint 만들기 - 2화
https://centbin-dev.tistory.com/9
'개발이야기 > Flutter + Dart' 카테고리의 다른 글
[Flutter] Provider 패턴 (0) | 2020.02.25 |
---|---|
[Flutter] Firebase 연동 - google Login (0) | 2020.02.20 |
[Flutter] AndroidX 마이그레이션 문제 해결 방법 (0) | 2020.02.19 |
Dart로 Server와 Client 만들기 - 2화 (1) | 2019.11.17 |
Flutter 앱 시작하기 - Windows 10 + VS Code 환경 (0) | 2019.10.03 |
댓글