IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> Flutter 实战开发-网络请求 -> 正文阅读

[网络协议]Flutter 实战开发-网络请求

flutter中常见的网络请求有三种分别是

1,Dart 原生的网络请求 HttpClient、

2,第三方网络请求 http

3,以及 Flutter 中的 Dio。

本文主要比较细致的讲解上述网络请求框架,以及对于charles抓包问题的处理。
本文demo

演示效果

Kapture 2021-09-08 at 16.17.05

一、HttpClient

HttpClient位于dart:io包中,属于dart语言自带网络请求

import 'dart:convert';
import 'dart:io';

1.1、创建一个HttpClient

Dart定义变量的方式,这里可以使用var、HttpClient、final都行

// 1.创建HttpClient对象
final httpClient = HttpClient();
// final HttpClient httpClient = new HttpClient();

1.2、构建请求的uri(请求参数)

在这步我们可以设置http或者https、host、请求参数queryParameters等,具体参考Uri源码,如下

factory Uri(
    {String? scheme,
    String? userInfo,
    String? host,
    int? port,
    String? path,
    Iterable<String>? pathSegments,
    String? query,
    Map<String, dynamic /*String|Iterable<String>*/ >? queryParameters,
    String? fragment}) = _Uri;

当然我们也可以直接写死请求链接

// 2.构建请求的uri
final uri = Uri.parse("http://www.tianqiapi.com/api/?version=v1&appid=97799796&appsecret=mN3u09pY");

上述方式等价于

final Uri uri=Uri(scheme: "http", host: "www.tianqiapi.com",path:'/api/' , queryParameters: {
  "version":"v1",
  "appid":"97799796",
  "appsecret":"mN3u09pY",
});

1.3、设置网络请求代理

没有抓包需求的可以不看这步。

Flutter 应用的网络请求是不走手机的系统代理的,如有charles、fiddler抓包需求,需要设置代理如下:

// 3.设置debug代理
httpClient.findProxy = (uri) {
  // 用1个开关设置是否开启代理
  return AppConstant.isDebug ?  "PROXY localhost:8888" : 'DIRECT';
};

1.4、构建请求

1.4.1、设置请求方式

在这步我们可以设置请求方式

// 4.构建请求(同时您也可以配置请求headers、 body。)
final request = await httpClient.getUrl(uri);

post、delete如下,更多可以点进去参照源码

final request = await httpClient.postUrl(uri);
final request = await httpClient.deleteUrl(uri);

1.4.2、设置headers

request.headers.add("user-agent", "test");
request.headers.add("Authorization", "LKSJDLFJSDLKJSLKklsdj");

charles抓包验证如下

image-20210908152506060

1.4.3、设置cookies

request.cookies.add(Cookie("name", "value"));

charles抓包验证如下

image-20210908152413909

1.5、发送请求

// 5.发送请求,必须
final response = await request.close();

1.6、解码响应的内容

注意这里需要utf8转码,否则显示乱码

if (response.statusCode == HttpStatus.ok) {
  // 6.解码响应的内容.
  var temp = await response.transform(utf8.decoder).join();
  var result = json.decode(temp);
  setState(() {
    this.result = result.toString();
  });
}

1.7、全部代码

void requestNetwork() async {
  // 1.创建HttpClient对象
  final httpClient = HttpClient();
  // final HttpClient httpClient = new HttpClient();

  // 2.构建请求的uri
  final uri = Uri.parse("http://www.tianqiapi.com/api/?version=v1&appid=97799796&appsecret=mN3u09pY");
  // final Uri uri=Uri(scheme: "http", host: "www.tianqiapi.com",path:'/api/' , queryParameters: {
  //   "version":"v1",
  //   "appid":"97799796",
  //   "appsecret":"mN3u09pY",
  // });

  // 3.设置debug代理
  httpClient.findProxy = (uri) {
    // 用1个开关设置是否开启代理
    return AppConstant.isDebug ?  "PROXY localhost:8888" : 'DIRECT';
  };

  // 4.构建请求(同时您也可以配置请求headers、 body。)
  final request = await httpClient.getUrl(uri);
  // final request = await httpClient.postUrl(uri);
  // final request = await httpClient.deleteUrl(uri);

  // request.cookies.add(Cookie("name", "value"));
  // request.headers.add("user-agent", "test");
  // request.headers.add("Authorization", "LKSJDLFJSDLKJSLKklsdj");

  // 5.发送请求,必须
  final response = await request.close();
  setState(() {
    this.statusCode = response.statusCode.toString();
  });
  if (response.statusCode == HttpStatus.ok) {
    // 6.解码响应的内容.
    var temp = await response.transform(utf8.decoder).join();
    var result = json.decode(temp);
    setState(() {
      this.result = result.toString();
    });
  }
}

二、http

添加依赖与导包

pubspec.yaml的dependencies添加

http : 0.13.3

导包

import 'package:http/http.dart' as http;

2.1、创建Client

// 1.创建Client
final client = http.Client();d

2.2、构建请求的uri(请求参数)

请求参数参考上面的1.2步骤

// 2.构建uri
final url = Uri.parse("http://www.tianqiapi.com/api/?version=v1&appid=97799796&appsecret=mN3u09pY");

2.3、发送请求

更改这里的get,切换请求方式

// 3.发送请求
final response = await client.get(url);

2.4、获取结果

if (response.statusCode == HttpStatus.ok) {
  var temp = response.body;
  var result = json.decode(temp);
  setState(() {
    this.result = result.toString();
  });
}

2.5、全部代码

void requestNetwork() async {
  // 1.创建Client
  final client = http.Client();

  // 2.构建uri
  final url = Uri.parse("http://www.tianqiapi.com/api/?version=v1&appid=97799796&appsecret=mN3u09pY");

  // 3.发送请求
  final response = await client.get(url);

  // 4.获取结果
  setState(() {
    this.statusCode = response.statusCode.toString();
  });
  if (response.statusCode == HttpStatus.ok) {
    var temp = response.body;
    var result = json.decode(temp);
    setState(() {
      this.result = result.toString();
    });
  }
}

三、Dio

添加依赖与导包

pubspec.yaml的dependencies添加

dio : 4.0.0

导包

import 'package:dio/dio.dart';

3.1、创建Dio请求对象

final dio = Dio();

3.2、构建请求的uri(请求参数)

请求参数参考上面的1.2步骤

// 2.构建uri
final url = Uri.parse("http://www.tianqiapi.com/api/?version=v1&appid=97799796&appsecret=mN3u09pY");

3.3、设置网络请求代理

// 3.设置debug代理
(dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate = (client) {
  client.findProxy = (Uri) {
    // 用1个开关设置是否开启代理
    return AppConstant.isDebug ?  "PROXY localhost:8888" : 'DIRECT';
  };
};

3.4、发送请求

更改这里的getUri,切换请求方式

// 4.发送网络请求
final response = await dio.getUri(uri);

3.5、获取结果

response.data.toString()

3.6、全部代码

void requestNetwork() async {
  // 1.创建Dio请求对象
  final dio = Dio();

  // 2.构建uri
  final uri = Uri.parse("http://www.tianqiapi.com/api/?version=v1&appid=97799796&appsecret=mN3u09pY");

  // 3.发送网络请求
  final response = await dio.getUri(uri);

  // 4.打印请求结果
  setState(() {
    this.statusCode = response.statusCode.toString();
  });
  if (response.statusCode == HttpStatus.ok) {
    setState(() {
      this.result = response.data.toString();
    });
  }
}
  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-09-22 15:00:59  更:2021-09-22 15:01:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 1:38:37-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码