以前、Qiitaの方に、PythonでSlackのWebAPIを使ってメッセージを送る(JSONベース)という記事を投稿しました。

今回、最近ハマっているDartでこの記事のコードを書き直してみました。
結論から言うと、Dart素敵です。

httpパッケージを利用

Dartの公式外部ライブラリです。
https://pub.dartlang.org/packages/http

「Dart json post」とかでググると出てくる情報が大体このパッケージを使ったサンプルになっています。

import 'dart:convert';
import 'package:http/http.dart' as http;

/// 外部パッケージであるhttp.dartを利用するサンプル
Future<void> main() async {

  const String slackToken = '{OAUTH_TOKEN_HERE_FOR_A_SLACK}';

  const Map<String, String> data = {
    "channel": "#general",
    "username": "Dart",
    "text": "This is a message fomr Dart!!",
    "icon_emoji": ":snake:"
  };

  final http.Response response = await http.post(
      'https://slack.com/api/chat.postMessage',
      headers: {
        'Content-Type': 'application/json',
        'Authorization': 'Bearer ${slackToken}'
      },
      body: json.encode(data)
  );

  print(response.statusCode);
  print(response.headers);
  print(response.body);
}

Dartの標準ライブラリのみ利用

標準ライブラリに含まれているdart:convertdart:ioのみ利用するので、pub(パッケージマネージャ)が必要ありません。

import 'dart:convert';
import 'dart:io';

/// Use default dart library only.
Future<void> main() async {

  const String slackToken = '{OAUTH_TOKEN_HERE_FOR_A_SLACK}';

  const Map<String, String> data = {
    "channel": "#general",
    "username": "Dart",
    "text": "This is a message fomr Dart!! yeah!!",
    "icon_emoji": ":snake:"
  };

  final HttpClient client = HttpClient();
  final HttpClientRequest request = await client.postUrl(Uri.parse('https://slack.com/api/chat.postMessage'));
  request.headers.contentType = ContentType("application", "json", charset: "utf-8");
  request.headers.add(HttpHeaders.authorizationHeader, "Bearer ${slackToken}");
  request.write(json.encode(data));
  final HttpClientResponse response = await request.close();
  client.close();

  final String responseBody = await response.transform(utf8.decoder).join();
  final dynamic responseJson = jsonDecode(responseBody);
  print(responseJson);
}

感想

行数で言えばどちらもほとんど変わりませんが、明らかにhttp外部ライブラリを使ったほうがスッキリしますね。
ただ、標準パッケージだけでもそこまで複雑なコードではないので、やはりコレぐらいの簡単なスクリプトであれば個人的には標準ライブラリだけで実装したいですね。(パッケージマネージャ嫌い)

なお、標準ライブラリを使った書き方であれば、StreamTransformerクラスを一緒に使うことで、例えばファイルをサーバに送信する際に、今全体の何%まで送信したか、という情報も取ることが出来るので、やはり標準ライブラリを使った書き方自体は理解しておいて損は無いなと思います。

Dartは型を省略して書くことが出来ますが、今回は型を全てちゃんと指定しました。