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のclient
をio_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