flutter-网络请求

439 阅读3分钟

前言

本文主要讲解 flutter 中的http请求的使用,这里默认没有https的证书校验步骤,默认https也可以

而即时通信 socket,直接搜索即可,一般采用的都是 WebSocket 或者类似的封装,这里不多介绍

设置测试接口地址(注册并自己生成接口即可): rap2.taobao.org/

HttpClient

dart:io 库中默认的网络请求工具,功能比较小,只适合简单的网络请求,甚至postbody都不支持

使用前需要导入该仓库,看名字就知道不主做网络请求

import 'dart:io';

get请求

//创建请求对象
final client = HttpClient();
final uri = Uri.parse("http://rap2api.taobao.org/app/mock/224518/api/chat/list");
//获取请求头对象
final request = await client.getUrl(uri); //获取urlRequest
// request.headers.add("token", "13123");//可以设置header
//发起get请求,await等待请求结果
final res = await request.close();
//ok则成功
if (res.statusCode == HttpStatus.ok) {
  final stringData = await res.transform(utf8.decoder).join();
  jsonDecode(stringData); //转化成map
  print(stringData);
}

post请求

//与get类似,但是没看到传body的参数,只能通过uri传递query类型参数,即:和get一样参数在url中
final postRequest = await client.postUrl(uri);
final postRes = await request.close();
if (res.statusCode == HttpStatus.ok) {
  final stringData = await postRes.transform(utf8.decoder).join();
  jsonDecode(stringData); //转化成map
  print(stringData);
}

http三方框架

官方推出的一个很好的用三方库,可以直接入手,推荐使用

需要导入高仓库,但是其内部的方法可以像c一样,直接调用get或者post函数

import 'package:http/http.dart';

get请求

//如果带参数可以在queryParamters中传递get参数
final uri = Uri(
  scheme: 'http',
  host: 'rap2api.taobao.org',
  path: 'app/mock/224518/api/chat/list',
  //get、post中需要query类型参数是可以使用
  //query是一种传递方式,get、post都支持,默认拼接到url中的,可以根据需要传递
  queryParameters: {},
);
final uri2 = Uri.parse("http://rap2api.taobao.org/app/mock/224518/api/chat/list");
//get请求
//没有参数,可以直接翻译url
get(uri2).then((res) {
  print(res.body);
  jsonDecode(res.body); //转化成map
}).catchError((err) {
  print(err);
});

post请求

//post与get类似,多了一个body传递对象参数,与get不同的是他默认以body传输
post(Uri.parse('http://rap2api.taobao.org'), body: {}).then((res) {
  print(res.body);
  jsonDecode(res.body); //转化成map
}).catchError((err) {
  print(err);
});

重名方法解决方案

如果内部有重名冲突方法,可以通过 as 声明一个对象接收,如下所示

//如果有
import 'package:http/http.dart' as http;

调用方式
http.get();
http.post();

dio三方库(力推)

dio是一个很优秀的三方库,支持的功能也非常多,处理基本的get、post请求,还支持请求拦截等,当然这里只介绍基本使用

导入该仓库

import 'package:dio/dio.dart';

get请求

//get 请求
Dio().get("http://rap2api.taobao.org/app/mock/224518/api/chat/list").then((res) {
  print(res);
}).catchError((err) {
  print(err);
});
final parameters = {
  'token': 'askdfskdfhaku23'
};
//传递参数,一般就搞定一个header和timeout
final options = Options();
options.receiveTimeout = 30;
options.headers = {
  "type": 'wechat'
};
Dio().get("http://rap2api.taobao.org", queryParameters: parameters, options: options);

post请求

//发起post请求
Dio().post("http://rap2api.taobao.org/").then((res) {
  print(res);
}).catchError((err) {
  print(err);
});
//除了url常用的两个方法,data也就是body字段,post常用的参数
//queryParameters就是和get一样的传参方式,拼接到url上,一些借口也在使用,一般同时支持get、post的都是这种形式
Dio().post("http://rap2api.taobao.org", data: {}, queryParameters: {}, options: options);

注意

一般网络请求只有一个 http 请求,一般使用一个单例即可,例如:HttpClient、dio,如果使用了多个http,那么可以创建多个个请求服务,或者管理类,也方便使用和管理

最后

这只是一个开始,网络请求对于实际项目中,还是需要封装的,例如:基本header,token校验、code错误码等

快来尝试一下吧,推荐 httpdio三方库使用哈,第一个默认的作为了解,真的不好用,功能还少,但是咱们见到得会改,或者最基本的场景也许会有奇效😂