CERTIFICATE_VERIFY_FAILED尝试从API导入数据



我正在努力学习扑动/Dart,我有很多问题。现在我试图从API获得一些值。我的代码是:

import 'dart:convert';
import 'package:http/http.dart' as http;
import 'package:myapp01_apirequest/src/models/uplink_models.dart';
class UplinksProvider{
String _url       = 'xxx.yyy.com';
Future<List<Uplink>> getEnCines() async{
try{
final url = Uri.https(_url, ':14442/api/external/login', {
'username': 'Joe689',
'password': '15.Job_1825zz'
});
final resp = await http.get(url);
final decodedData = json.decode(resp.body);
print('Patata');
print(decodedData);

return [];
}catch (error){
print('++++++++++///////++++++++++++++++');
print(error);
print('++++++++++*******++++++++++++++++');
}
}
}

阅读Uri构造函数文档,我明白我必须将url拆分为3。

  • 第一个是authority。就我而言,我认为是xxx.yyy.com
  • 第二个是unencodedPath。在我的情况下,我认为是:14442/api/external/login
  • 最后一个地图与参数在我的情况下的用户名和传递(唯一的事情我很确定是正确的在我的代码)。

如果我这样做,出现任何问题,但print('Patata');print(decodeData);不出现。另外,打开一个名为io_client.dart的文件并标记下一行。

var ioRequest = (await _inner.openUrl(request.method, request.url))

控制台没有显示(我认为):

Launching libmain.dart on LG M700 in debug mode...
libmain.dart:1
Formato de par�metros incorrecto:
√ Built buildappoutputsflutter-apkapp-debug.apk.
Connecting to VM Service at ws://127.0.0.1:55883/KBAtv2-Jljc=/ws

为什么没有错误出现,但我不能获得我想要的数据?


编辑:

根据@Preet Shah的说法,我按下了"VS运行"按钮。并出现以下异常三次:

I/flutter ( 1932): ++++++++++///////++++++++++++++++
I/flutter ( 1932): HandshakeException: Handshake error in client (OS Error:
I/flutter ( 1932):  CERTIFICATE_VERIFY_FAILED: Hostname mismatch(handshake.cc:354))
I/flutter ( 1932): ++++++++++*******++++++++++++++++

最后出现:

I/Choreographer( 1932): Skipped 148531 frames!  The application may be doing too much work on its main thread.
D/vndksupport( 1932): Loading /vendor/lib/hw/android.hardware.graphics.mapper@2.0-impl.so from current namespace instead of sphal namespace.
D/vndksupport( 1932): Loading /vendor/lib/hw/gralloc.msm8937.so from current namespace instead of sphal namespace.
I/Choreographer( 1932): Skipped 35 frames!  The application may be doing too much work on its main thread.

那么这个问题就是一个认证问题,CERTIFICATE_VERIFY_FAILED。随着我对python越来越熟悉,我做了一些测试来理解这个问题。我已经能够验证此API要求将所有认证验证设置为false,否则它永远不会离开循环。以下是我的Python代码(只是为了展示我所说的内容)。

import requests
import json
log_params = {'username': 'Joe689', 'password': '15.Job_1825zz'}
headers = {'Content-type': 'application/json'}
url = 'https://xxx.yyy.com:14442/api/external/login'

response = requests.post(url, data=json.dumps(params), headers=self.headers, verify=False)
finalRes = json.loads(response.text)

正如我所说,这段代码只是为了让我理解这个问题,因为我是Dart的新手。在这里,我找到了这个答案,似乎有解决方案,但我不知道如何实现它,使用我的Uri.https结构(也许这是不可能的)。

我试过了,但是不工作:

Map<String, String> requestHeaders = {
'Content-type': 'application/json'
};
final resp = await http.get(url, headers:requestHeaders);

非常感谢。

试试这个:

HttpClient client = new HttpClient();
client.badCertificateCallback = ((X509Certificate cert, String host, int port) => true);
String url ='xxx.yyy.com:14442/api/external/login';
Map map = { 
"email" : "Joe689" , 
"password" : "15.Job_1825zz"
};
HttpClientRequest request = await client.getUrl(Uri.parse(url));
request.headers.set('content-type', 'application/json');
request.add(utf8.encode(json.encode(map)));
HttpClientResponse response = await request.close();
String reply = await response.transform(utf8.decoder).join();
print(reply);

现在,检查reply包含什么。并相应地返回数据。

相关内容

  • 没有找到相关文章

最新更新