Flutter(十九)——网络编程:HttpClient与http库

简介: Flutter(十九)——网络编程:HttpClient与http库

前言


不管是前端,还收后端,都涉及到网络编程的知识,在Flutter开发中也不例外,所以我们有必要掌握Flutter怎么请求网络。


比如在Android开发中,有各种的网络库:OkHttp,Vollery,HttpClient,HttpUrlConnection等,其实在Flutter开发中也有这样的请求库:HttpClient以及Http库。


HttpClient


首先,我们来先介绍一下做为Dart语言自带的网络请求库HttpClient,作为一个开发移动端程序的程序员来说,都知道网络请求都不能在UI主线程中进行,不然会造成界面卡顿,所以这里我们也要结合Dart语言的异步请求,来讲解网络请求。


GET请求

在网络请求之中,有get请求与post请求的分别,这里属于网络协议的知识,属于基础这里不在讲解,不懂的可以专门购买网络协议的知识,我们直接来看看它的用法:

String _textString="";
_getUrlText() async{
    HttpClient client=new HttpClient();
    HttpClientRequest request=await client.getUrl(Uri.parse("https://www.baidu.com/index.php?tn=monline_3_dg"));
    request.headers.add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0");
    HttpClientResponse response=await request.close();
    _textString=await response.transform(Utf8Decoder()).join();
    print(_textString);
    client.close();
  }


这里我们定义了一个HttpClient,设置了其请求的页面,也设置了其请求头User-Agent,然后返回了其字符串,并且给打印了出来,代码很简单,在HttpClient库中,常规的get网络请求就是如此了,唯一需要注意的地方就是记得使用close方法关闭。


POST请求

在网络请求之中,有时候也需要传入特定的参数且不被发现参数的具体值,这个时候就需要考虑使用Post请求来获取数据,使用的代码如下所示:

_postUrlText() async{
    HttpClient client=HttpClient();
    HttpClientRequest request=await client.postUrl(Uri.parse("https://www.baidu.com/index.php?tn=monline_3_dg"));
    request.headers.set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0");
    Map jsonMap={'username':'liyuanjinglyj','password':'ssssssssssssssssss'};//设置请求参数
    request.add(utf8.encode(json.encode(jsonMap)));
    HttpClientResponse response=await request.close();
    _textString=await response.transform(Utf8Decoder()).join();
    print(_textString);
    client.close();
  }


POST请求基本上和Get差不多,除了将client.getUrl换成了client.postUrl,以及设置其请求参数的设置,当然项目中,这里肯定需要捕获异常,博主为了方便讲解,省去了那些代码,让代码直观一点。


http库


在Flutter开发中,除了HttpClient库之外,还可以使用官方推荐的http库,因为其包含了一些非常方便的函数,可以让我们更方便的访问网络,获取资源,同时http库还支持手机端和PC端,功能真心很强大,不过在使用之前,我们需要在pubspec.yaml里添加http库,代码如下:

dependencies:
  http: ^0.12.0//这句是添加
  flutter:
    sdk: flutter


GET请求

为了对比一下http库与HttpClient使用两者的使用区别,我们直接改变一下上面的get请求,看看http库中是如何实现其功能的,代码如下:

_http_getUrlText() async{
    var client=http.Client();
    var uri=Uri.parse("https://www.baidu.com/index.php?tn=monline_3_dg");
    http.Response response=await client.get(uri);
    print(utf8.decode(response.bodyBytes));
    client.close();
  }


代码很直观明了,唯一需要注意的是记得用utf8.decode方法把网页获取的内容进行转码,否则返回的就是乱码。


POST请求

同样,我们改变一下HttpClient的Post请求,用http库实现看看,代码如下:

_http_postUrlText() async{
    var client=http.Client();
    Map<String,String> headerMap={'username':'liyuanjinglyj','password':'ssssssssssssssssss'};
    http.Response response=await client.post("https://www.baidu.com/index.php?tn=monline_3_dg",headers: headerMap,body: {});
    print(utf8.decode(response.bodyBytes));
    client.close();
  }


为什么Post的请求会变成这样呢?你不妨点击编译器进去看一下Post方法源码,代码如下:

Future<Response> post(url,
      {Map<String, String> headers, body, Encoding encoding});

这个方法传入了3个参数:headers,body和encoding,我们可以根据项目的实际需求来更改其参数。


Flutter的网络请求就讲到这里,代码都不是很长,理解起来也简单,不过,既然官方推荐我们使用http库,项目中就尽量都使用http库。

相关文章
|
4月前
|
C++
基于Reactor模型的高性能网络库之地址篇
这段代码定义了一个 InetAddress 类,是 C++ 网络编程中用于封装 IPv4 地址和端口的常见做法。该类的主要作用是方便地表示和操作一个网络地址(IP + 端口)
283 58
|
4月前
|
网络协议 算法 Java
基于Reactor模型的高性能网络库之Tcpserver组件-上层调度器
TcpServer 是一个用于管理 TCP 连接的类,包含成员变量如事件循环(EventLoop)、连接池(ConnectionMap)和回调函数等。其主要功能包括监听新连接、设置线程池、启动服务器及处理连接事件。通过 Acceptor 接收新连接,并使用轮询算法将连接分配给子事件循环(subloop)进行读写操作。调用链从 start() 开始,经由线程池启动和 Acceptor 监听,最终由 TcpConnection 管理具体连接的事件处理。
171 2
|
4月前
基于Reactor模型的高性能网络库之Tcpconnection组件
TcpConnection 由 subLoop 管理 connfd,负责处理具体连接。它封装了连接套接字,通过 Channel 监听可读、可写、关闭、错误等
156 1
|
4月前
|
负载均衡 算法 安全
基于Reactor模式的高性能网络库之线程池组件设计篇
EventLoopThreadPool 是 Reactor 模式中实现“一个主线程 + 多个工作线程”的关键组件,用于高效管理多个 EventLoop 并在多核 CPU 上分担高并发 I/O 压力。通过封装 Thread 类和 EventLoopThread,实现线程创建、管理和事件循环的调度,形成线程池结构。每个 EventLoopThread 管理一个子线程与对应的 EventLoop(subloop),主线程(base loop)通过负载均衡算法将任务派发至各 subloop,从而提升系统性能与并发处理能力。
268 3
|
4月前
基于Reactor模式的高性能网络库github地址
https://github.com/zyi30/reactor-net.git
121 0
|
4月前
基于Reactor模型的高性能网络库之Poller(EpollPoller)组件
封装底层 I/O 多路复用机制(如 epoll)的抽象类 Poller,提供统一接口支持多种实现。Poller 是一个抽象基类,定义了 Channel 管理、事件收集等核心功能,并与 EventLoop 绑定。其子类 EPollPoller 实现了基于 epoll 的具体操作,包括事件等待、Channel 更新和删除等。通过工厂方法可创建默认的 Poller 实例,实现多态调用。
292 60
|
4月前
基于Reactor模型的高性能网络库之Channel组件篇
Channel 是事件通道,它绑定某个文件描述符 fd,注册感兴趣的事件(如读/写),并在事件发生时分发给对应的回调函数。
239 60
|
4月前
|
安全 调度
基于Reactor模型的高性能网络库之核心调度器:EventLoop组件
它负责:监听事件(如 I/O 可读写、定时器)、分发事件、执行回调、管理事件源 Channel 等。
286 57
|
4月前
基于Reactor模型的高性能网络库之时间篇
是一个用于表示时间戳(精确到微秒)**的简单封装类
197 57
|
4月前
|
JSON 网络安全 数据格式
Python网络请求库requests使用详述
总结来说,`requests`库非常适用于需要快速、简易、可靠进行HTTP请求的应用场景,它的简洁性让开发者避免繁琐的网络代码而专注于交互逻辑本身。通过上述方式,你可以利用 `requests`处理大部分常见的HTTP请求需求。
481 51