8

I am making an https post Request from my flutter app. as there I am using a self signed SSL certificate in server so when I hit the API I am receiving status code as 405, that I am not able to connect,

If I used HTTP package, I am getting bellow exception,

HandshakeException: Handshake error in client (OS Error: I/flutter ( 7107): CERTIFICATE_VERIFY_FAILED: self signed certificate(handshake.cc:352))

when I tried with deo package I am getting 405 status code, below is the code for that,

Response response;
    final Dio dio = Dio();
    (dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate =
    (HttpClient client) {
  client.badCertificateCallback =
      (X509Certificate cert, String host, int port) => true;
  return client;
};
  response = await dio.post(loginURL, data: {"username": username, "password": password});
  print(response.data.toString());
  print(response.statusCode);

I tried to avoid the SSL handshake by making

 client.badCertificateCallback =
          (X509Certificate cert, String host, int port) => true;

Still its not working any other solution?

mark
  • 1,045
  • 2
  • 13
  • 23
  • My guess is that your `dio` request is actually connecting OK (and your call back is working as you expect - returning true - you can check with a print statement of course). So the 405 is coming from the web server. The HTTPS connection was successful and the server responded that it didn't like your request. When you are using `http` you aren't specifying the callback, so you get the bad certificate exception as expected. It seems, with dio, that you are getting further than you think and now it's time to look at the server to confirm that it received the request. – Richard Heap Apr 29 '20 at 16:40

3 Answers3

9

This works for me

void main() {
  HttpOverrides.global = new MyHttpOverrides();
  runApp(MyApp());
}

class MyHttpOverrides extends HttpOverrides{
  @override
  HttpClient createHttpClient(SecurityContext context){
    return super.createHttpClient(context)
      ..badCertificateCallback = (X509Certificate cert, String host, int port)=> true;
  }
}

class MyApp extends StatelessWidget {
.....
Laurent
  • 210
  • 4
  • 15
1
    DioForNative dio = DioForNative();
    DefaultHttpClientAdapter httpClient = dio.httpClientAdapter;
    httpClient.onHttpClientCreate = (HttpClient client) {
      client.badCertificateCallback =
          (X509Certificate cert, String host, int port) {
        return true;
      };
    };

and then you can make dio.post and dio.get requests.

speeder
  • 74
  • 3
0

As previously mentioned in the comments, the HTTP request gets through since it returns a 405 error. HTTP error 405 usual points is usually defined as "Method not allowed", and commonly caused by incorrect request method. You may want to check with the server if it can receive the request that you're sending.

Omatt
  • 8,564
  • 2
  • 42
  • 144