我正在努力学习扑动/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
包含什么。并相应地返回数据。