はい!今やってます!

Work Pertly, Live Idly

Dartでhttpパッケージを使ってAPIリクエストを投げたらCERTIFICATE_VERIFY_FAILEDになるときの対応方法

この記事は何?

Flutterのhttp/http.dartパッケージを使ってAPIリクエストを投げたら、送信先のサーバーが証明書を設定しておらずCERTIFICATE_VERIFY_FAILEDになるときの対応方法。 証明書エラーを無視してリクエストを送信したいときの方法を記載しています。

経緯

FlutterをDartで書いていて、API Clientにhttp/http.dartのパッケージを利用してAPIリクエストをサーバー側に送信していた。

import 'package:http/http.dart'

String url = "https://hogehoge/fuga";
Map<String, String> headers = {'content-type': 'application/json'};
String body = json.encode({'hoge': hoge, 'limit': 1000, 'offset': 0});
var response = await http.post(url, headers: headers, body: body);
var records = json.decode(response.body);

ちょっとサーバー上で動かすデモAPIができたので、リクエストしようと思ったら

CERTIFICATE_VERIFY_FAILED

というエラーが出た。 実際に表示されたエラーはこちら↓

[VERBOSE-2:ui_dart_state.cc(148)] Unhandled Exception: HandshakeException: Handshake error in client (OS Error:
    CERTIFICATE_VERIFY_FAILED: ok(handshake.cc:352))
#0      IOClient.send (package:http/src/io_client.dart:33:23)
<asynchronous suspension>
#1      BaseClient._sendUnstreamed (package:http/src/base_client.dart:169:38)
<asynchronous suspension>
#2      BaseClient.post (package:http/src/base_client.dart:54:7)
#3      post.<anonymous closure> (package:http/http.dart:70:16)
#4      _withClient (package:http/http.dart:166:20)
<asynchronous suspension>
#5      post (package:http/http.dart:69:5)

対応

  • 概要

httpのclientio_clientでwrapしてリクエストを送信し、その際にbadCertificateCallbackを設定してやる。

  • コード
import 'package:http/io_client.dart';
import 'dart:io';
import 'package:http/http.dart'


HttpClient client = new HttpClient();
client.badCertificateCallback = ((X509Certificate cert, String host, int port) => true);
final http = new IOClient(client);

String url = "https://hogehoge/fuga";
Map<String, String> headers = {'content-type': 'application/json'};
String body = json.encode({'hoge': hoge, 'limit': 1000, 'offset': 0});
var response = await http.post(url, headers: headers, body: body);
var records = json.decode(response.body);

これでOK

優れたデータビジュアライゼーションのサンプルを提供する「Data Viz Project」

ビジネスマンは常日頃からスライド作ったり、状況を報告したり、 どうしたら直感的に情報が伝わって、相手とも情報をもれなく共有することができるか、 常に頭を悩ませていますよね。

データをビジュアライズして初めて見えてくるファクトも多いと思います。 そんな時は「Data Viz Project」を開いてみてください。

f:id:yuji_ueda:20190630125853p:plain
datavizproject

datavizproject.com