Flutter网络请求的3种简单实现方法
概述:
App几乎都离不开与服务器的交互,本文主要讲解了flutter网络请求三种方式flutter自带的HttpClient、第三方库http和第三方库Dio 的简单实现GET和POST请求,本文是笔者学习Flutter网络模块知识总结,若有问题还望不腻赐教。
一.系统自带HttpClient
1.使用中温馨提示
1.1.导入库
import'dart:io';//网络请求 import'dart:convert';//数据解析
1.2.Uri的多种初始化方式
//方法1
Uriuri=Uri(scheme:'https',host:'app.xxx.com',path:homeNoviceListUrl);
//方法2
Uriuri=Uri.https('app.xxx.com',homeNoviceListUrl);
//uri方法3
Uriuri=Uri.parse(baseUrl+homeNoviceListUrl);
2.简单使用
2.1.GET请求
//1.1HttpClient-get
voidloadData_sys_get()async{
print('------loadData_sys_get--------');
varhttpClient=newHttpClient();
varparams=Map();
//uri方法1
Uriuri=
Uri(scheme:'https',host:'app.xxx.com',path:homeNoviceListUrl);
//uri方法2
//Uriuri=Uri.https(
//'app.xxx.com',homeNoviceListUrl);
//uri方法3
//Uriuri=Uri.parse(baseUrl+homeNoviceListUrl);
varrequest=awaithttpClient.getUrl(uri);
varheaders=Map();
headers['loginSource']='IOS';
headers['useVersion']='3.1.0';
headers['isEncoded']='1';
headers['bundleId']='com.xxx.xxx';
request.headers.add("loginSource","IOS");
request.headers.add("useVersion","3.1.0");
request.headers.add("isEncoded","1");
request.headers.add("bundleId","com.xxx.xxx");
varresponse=awaitrequest.close();
varresponseBody=awaitresponse.transform(Utf8Decoder()).join();
if(response.statusCode==HttpStatus.ok){
print('请求头:${response.headers}');
print('111请求成功代发数据为:\n$responseBody');
print('--------------');
Mapdata=jsonDecode(responseBody);
print('222请求成功代发数据为:\n$data');
}else{
print('\n\n\n11111==请求失败${response.statusCode}');
}
}
2.2.POST请求
注意点:请求参数需要编码后放在request中
voidloadData_sys_post()async{
print('------loadData_sys_post--------');
HttpClienthttpClient=newHttpClient();
//queryParametersget请求的查询参数(适用于get请求???是吗???)
//Uriuri=Uri(
//scheme:"https",host:"app.xxx.com",path:homeRegularListUrl);
//HttpClientRequestrequest=awaithttpClient.postUrl(uri);
varurl=baseUrl+homeRegularListUrl;
HttpClientRequestrequest=awaithttpClient.postUrl(Uri.parse(url));
//设置请求头
request.headers.set("loginSource","IOS");
request.headers.set("useVersion","3.1.0");
request.headers.set("isEncoded","1");
request.headers.set("bundleId","com.xxx.xxx");
//Content-Type大小写都ok
request.headers.set('content-type','application/json');
///添加请求体
///https://stackoverflow.com/questions/50278258/http-post-with-json-on-body-flutter-dart/50295533
MapjsonMap={'currentPage':'1'};
request.add(utf8.encode(json.encode(jsonMap)));
HttpClientResponseresponse=awaitrequest.close();
StringresponseBody=awaitresponse.transform(utf8.decoder).join();
if(response.statusCode==HttpStatus.ok){
print('请求成功');
print(response.headers);
print(responseBody);
}
}
二.请求第三方库http
1.使用中温馨提示
1.1.添加依赖
dependencies: http:^0.12.0#latestversion
1.2.导入库
import'package:http/http.dart'ashttp;//导入前需要配置
2.简单使用
2.1.GET请求
2.2.1.http-get1
voidloadData_http_get()async{
print('------loadData_http_get--------');
varclient=http.Client();
varuri=Uri.parse(baseUrl+homeNoviceListUrl);
http.Responseresponse=awaitclient.get(uri);
if(response.statusCode==HttpStatus.ok){
print(response.body);
}else{
print('请求失败code码为${response.statusCode}');
}
}
2.2.http-get简便方法(链式编程)
voidloadData_http_get_convenience()async{
print('------简便方法loadData_http_get_convenience--------');
varuri=Uri.parse(baseUrl+homeNoviceListUrl);
http.Client().get(uri).then((http.Responseresponse){
if(response.statusCode==HttpStatus.ok){
print(response.body);
}else{
print('请求失败code码为${response.statusCode}');
}
});
}
2.2.POST请求
2.2.1. http-post
voidloadData_http_post()async{
print('------loadData_http_post--------');
varheaders=Map();
headers["loginSource"]="IOS";
headers["useVersion"]="3.1.0";
headers["isEncoded"]="1";
headers["bundleId"]="com.xxx.xxx";
headers["loginSource"]="IOS";
headers["Content\-Type"]="application/json";
Mapparams={'currentPage':'1'};
//嵌套两层都可以,但是具体哪个好还有待确认????
varjsonParams=utf8.encode(json.encode(params));
//varjsonParams=json.encode(params);
varhttpClient=http.Client();
varuri=Uri.parse(baseUrl+homeNoviceListUrl);
http.Responseresponse=
awaithttpClient.post(uri,body:jsonParams,headers:headers);
if(response.statusCode==HttpStatus.ok){
print(response.body);
}else{
print('请求失败code码���${response.statusCode}');
}
}
2.2.2.http-Post简便方法(链式编程)
voidloadData_http_post_convenience()async{
print('------loadData_http_post--------');
varheaders=Map();
headers["loginSource"]="IOS";
headers["useVersion"]="3.1.0";
headers["isEncoded"]="1";
headers["bundleId"]="com.xxx.xxx";
headers["loginSource"]="IOS";
headers["Content\-Type"]="application/json";
Mapparams={'currentPage':'1'};
//嵌套两层都可以,但是具体哪个好还有待确认????
varjsonParams=utf8.encode(json.encode(params));
//varjsonParams=json.encode(params);
varhttpClient=http.Client();
varurl=baseUrl+homeRegularListUrl;
httpClient.post(url,body:jsonParams,headers:headers).then((response){
print("Responsestatus:${response.statusCode}");
print("Responsebody:${response.body}");
}).whenComplete(httpClient.close);
}
三.请求第三方库Dio
1.使用中温馨提示
1.1.添加依赖
dependencies: dio:^2.0.11#latestversion
1.2.导入库
import'package:dio/dio.dart';
2.简单使用
2.1.GET请求
注意:Dio的get请求(baseUrl都是在dio.option.baseUrl设置的)请求头可以在dio.option上设置,也可以在新建的option上设置,新建option是可选的
voidloadData_dio_get()async{
varheaders=Map();
headers['loginSource']='IOS';
headers['useVersion']='3.1.0';
headers['isEncoded']='1';
headers['bundleId']='com.xxx.xxx';
headers['Content-Type']='application/json';
Diodio=Dio();
dio.options.headers.addAll(headers);
dio.options.baseUrl=baseUrl;
Responseresponse=awaitdio.get(homeNoviceListUrl);
if(response.statusCode==HttpStatus.ok){
print(response.headers);
print(response.data);
}
}
2.2.POST请求
注意:
dio.options.method设置是无效
Diodio=Dio();
dio.options.method='post';办法:
新建一个Options对象,然后在发起请求的时候进行设置:
Optionsoption=Options(method:'post');
Responseresponse=awaitdio.request(homeRegularListUrl,data:{"currentPage":"1"},options:option);
2.2.1.dio-方式一(baseUrl都是在dio.option.baseUrl设置的)
注意:直接在dio.options设置除methods以外的请求头参数
voidloadData_dio_dioOfOptionsSetting()async{
debugPrint(
'\npost请求=======================开始请求=======================\n');
varheaders=Map();
headers['loginSource']='IOS';
headers['useVersion']='3.1.0';
headers['isEncoded']='1';
headers['bundleId']='com.xxx.xxx';
headers['Content-Type']='application/json';
Diodio=Dio();
dio.options.baseUrl=baseUrl;
dio.options.connectTimeout=60000;
dio.options.receiveTimeout=60000;
dio.options.headers.addAll(headers);
dio.options.method='post';
Optionsoption=Options(method:'post');
//Responseresponse=awaitdio.request(homeRegularListUrl,
//data:{"currentPage":"1"},options:option);
Responseresponse=awaitdio.post(homeRegularListUrl,
data:{"currentPage":"1"},options:option);
if(response.statusCode==HttpStatus.ok){
debugPrint('请求参数:${response.request.queryParameters}');
debugPrint(
'-------------------请求成功,请求结果如下:-----------------\n\n===请求求url:${response.request.uri.toString()}\n\n===请求���:\n${response.headers}\n\n===请求结果:\n${response.data}\n');
debugPrint('-------------------请求成功,请求结果打印完毕----------------');
}else{
print('请求失败');
}
}
2.2.2.dio-方式二(baseUrl都是在dio.option.baseUrl设置的)
注意:在新建的option上设置请求头参数
voidloadData_dio_newOptionSetting()async{
debugPrint('\n=======================开始请求=======================\n');
varheaders=Map();
headers['loginSource']='IOS';
headers['useVersion']='3.1.0';
headers['isEncoded']='1';
headers['bundleId']='com.xxx.xxx';
headers['Content-Type']='application/json';
Optionsoption=Options(method:'post');
option.connectTimeout=60000;
option.receiveTimeout=60000;
option.headers.addAll(headers);
Diodio=Dio();
dio.options.baseUrl=baseUrl;
Responseresponse=awaitdio.post(homeRegularListUrl,
data:{"currentPage":1},options:option);
//Responseresponse=awaitdio.request(homeRegularListUrl,
//data:{"currentPage":1},options:option);
if(response.statusCode==HttpStatus.ok){
debugPrint('请求参数:${response.request.queryParameters}');
debugPrint(
'-------------------请求成功,请求结果如下:-----------------\n\n===请求url:${response.request.uri.toString()}\n\n===请求头:\n${response.headers}\n\n===请求结果:\n${response.data}\n');
debugPrint('-------------------请求成功,请求结果打印完毕----------------');
}else{
print('请求失败');
}
}
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对毛票票的支持。