Reputation: 79
I've got a problem when sending a POST request with this code on Android device.
import 'dart:async';
import 'dart:convert';
import 'package:http/http.dart' as http;
class NetworkUtil {
// next three lines makes this class a Singleton
static NetworkUtil _instance = new NetworkUtil.internal();
NetworkUtil.internal();
factory NetworkUtil() => _instance;
final JsonDecoder _decoder = new JsonDecoder();
static final baseURL = "https://myurl.com";
Future<dynamic> get(String url) {
return http.get(baseURL+url).then((http.Response response) {
final String res = response.body;
final int statusCode = response.statusCode;
if (statusCode < 200 || statusCode > 400 || json == null) {
throw new Exception("Error while fetching data");
}
return _decoder.convert(res);
});
}
Future<dynamic> post(String url, {Map headers, body, encoding}) {
return http
.post(baseURL+url, body: body, headers: headers, encoding: encoding)
.then((http.Response response) {
final String res = response.body;
final int statusCode = response.statusCode;
if (statusCode < 200 || statusCode > 400 || json == null) {
throw new Exception("Error while fetching data");
}
return _decoder.convert(res);
});
}
}
It throws an error
Instance of 'Future'
E/flutter (13631): [ERROR:topaz/lib/tonic/logging/dart_error.cc(16)] Unhandled exception:
E/flutter (13631): HandshakeException: Handshake error in client (OS Error:
E/flutter (13631): CERTIFICATE_VERIFY_FAILED: unable to get local issuer certificate(handshake.cc:363))
E/flutter (13631): #0 IOClient.send (package:http/src/io_client.dart:30:23)
E/flutter (13631): <asynchronous suspension>
E/flutter (13631): #1 BaseClient._sendUnstreamed (package:http/src/base_client.dart:171:38)
E/flutter (13631): <asynchronous suspension>
E/flutter (13631): #2 BaseClient.post (package:http/src/base_client.dart:56:5)
E/flutter (13631): #3 post.<anonymous closure> (package:http/http.dart:70:34)
E/flutter (13631): #4 _withClient (package:http/http.dart:167:20)
E/flutter (13631): <asynchronous suspension>
E/flutter (13631): #5 post (package:http/http.dart:70:3)
E/flutter (13631): #6 NetworkUtil.post (package:queue/class/network_util.dart:28:10)
E/flutter (13631): #7 MakeVerifyTelephoneButtonState._submitPressed (file:///Users/skulltree/Documents/TwinSynergyProjects/crossPlatform/manaqueue/lib/ui/verifybutton.dart:29:27)
E/flutter (13631): #8 GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:102:24)
E/flutter (13631): #9 TapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:161:9)
E/flutter (13631): #10 TapGestureRecognizer.acceptGesture (package:flutter/src/gestures/tap.dart:123:7)
E/flutter (13631): #11 GestureArenaManager.sweep (package:flutter/src/gestures/arena.dart:156:27)
E/flutter (13631): #12 _WidgetsFlutterBinding&BindingBase&GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:147:20)
E/flutter (13631): #13 _WidgetsFlutterBinding&BindingBase&GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:121:22)
E/flutter (13631): #14 _WidgetsFlutterBinding&BindingBase&GestureBinding._handlePointerEvent (package:flutter/src/gestures/binding.dart:101:7)
E/flutter (13631): #15 _WidgetsFlutterBinding&BindingBase&GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:64:7)
E/flutter (13631): #16 _WidgetsFlutterBinding&BindingBase&GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:48:7)
E/flutter (13631): #17 _invoke1 (dart:ui/hooks.dart:134:13)
E/flutter (13631): #18 _dispatchPointerDataPacket (dart:ui/hooks.dart:91:5)
However, With the same code, it runs fine on iOS devices. Is it possible that there's something I missing to configure on Android Studio or anything else.
Upvotes: 0
Views: 591
Reputation: 79
I've found the problem.
We use Let's encrypt and there's always have a problem with Android devices but iOS are working fine.
A solution for now as I test it by a switch to paid SSL Cert. And it worked like a charm.
Upvotes: 1
Reputation: 1928
This is a SSL Certificate error, make sure that the device time & date is right as well (if it's not the ssl certificate of the certificate can be outdated). If your website isn't HTTPS then use HTTP instead please
Also, on iOS be careful with the App Transport Security since it doesn't allow non HTTPS call by default
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
<key>NSExceptionDomains</key>
<dict>
<key>example.com</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
</dict>
</dict>
Upvotes: 0
Reputation: 91
the link used by you is not https. It has not been issued any security cerificate. Try http instead of https
Upvotes: 0