HttpClient抽象 接口

用于与 HTTP 服务器通信的 HTTP 客户端。

注意: 应避免直接使用 HttpClient 进行 HTTP 请求。您可以通过 IOClient 适配器在 package:http 中间接使用 HttpClient

使用更高级的库,如 package:http,可以在代码中做最小修改即可切换实现。例如,package:httpClient 具有浏览器实现以及适用于 Android 和 iOS 的使用平台原生 HTTP 客户端的实现。与 HttpClient 不同,这些原生实现可以与代理、VPN 等一起工作。

向 HTTP 服务器发送 HTTP 请求并接收响应。在多个对同一服务器的请求之间保持状态,包括会话 Cookie 和其他 Cookie。

HttpClient 包含多种方法将 HttpClientRequest 发送到 Http 服务器并接收 HttpClientResponse。例如,您可以使用 getgetUrlpostpostUrl 方法分别进行 GET 和 POST 请求。

简单 GET 请求示例

getUrl 请求是两步过程,由两个 Future 触发。当第一个 future 完成并返回一个 HttpClientRequest 时,底层的网络连接已建立,但尚未发送数据。在第一个 future 的回调函数中,可以在请求上设置 HTTP 头部和主体。要么是请求对象的第一次写入,要么是调用 close,都会将请求发送到服务器。

从服务器接收到 HTTP 响应后,第二个 future(由 close 返回)完成,并返回一个 HttpClientResponse 对象。此对象提供了对响应头和主体的访问。主体作为由 HttpClientResponse 实现的流可用。如果存在主体,则必须读取它。否则,会导致资源泄漏。如果主体未使用,请考虑使用 HttpClientResponse.drain

var client = HttpClient();
try {
  HttpClientRequest request = await client.get('localhost', 80, '/file.txt');
  // Optionally set up headers...
  // Optionally write to the request object...
  HttpClientResponse response = await request.close();
  // Process the response
  final stringData = await response.transform(utf8.decoder).join();
  print(stringData);
} finally {
  client.close();
}

通过 getUrlopen 等方法创建 HttpClientRequest 的 future。

HTTPS 连接

HttpClient 可以进行 HTTPS 请求,使用 TLS(SSL)安全网络协议连接到服务器。使用 https: 方案调用 getUrl 将自动工作,如果服务器的证书由 Mozilla 编译的默认知名受信任 CA(证书授权中心)签名。

要添加自定义受信任证书颁发机构或向请求客户端证书的服务器发送证书,请将SecurityContext对象作为可选的context参数传递给HttpClient构造函数。可以在SecurityContext对象上设置所需的选项。

头部信息

所有HttpClient请求默认设置以下头部信息

Accept-Encoding: gzip

这允许HTTP服务器在可能的情况下对正文使用gzip压缩。如果不希望这种行为,请将Accept-Encoding头部信息设置为其他内容。要关闭对响应的gzip压缩,请清除此头部信息

 request.headers.removeAll(HttpHeaders.acceptEncodingHeader)

关闭HttpClient

HttpClient支持持久连接并缓存网络连接,以便在可能的情况下重用它们来处理多个请求。这意味着在请求完成后,网络连接可以保持开启状态一段时间。使用HttpClient.close强制HttpClient对象关闭并关闭空闲网络连接。

开启和关闭代理

默认情况下,HttpClient使用环境中的代理配置,请参阅findProxyFromEnvironment。要关闭代理的使用,请将findProxy属性设置为null

HttpClient client = HttpClient();
client.findProxy = null;

构造函数

HttpClient({SecurityContext? context})
工厂

属性

authenticate ← (Future<bool> Function(Uri url, String scheme, String? realm)?)
设置当网站请求身份验证时将被调用的函数。
无getter
authenticateProxy ← (Future<bool> Function(String host, int port, String scheme, String? realm)?)
设置当代理请求身份验证时将被调用的函数。
无getter
autoUncompress bool
获取和设置是否自动解压缩响应正文。
getter/setter对
badCertificateCallback ← (bool Function(X509Certificate cert, String host, int port)?)
设置一个回调函数,用于决定是否接受无法由我们的受信任根证书认证的服务器证书的加密连接。
无getter
connectionFactory ← (Future<ConnectionTask<Socket>> Function(Uri url, String? proxyHost, int? proxyPort)?)
设置用于创建套接字连接的函数。
无getter
connectionTimeout Duration?
获取和设置连接超时。
getter/setter对
findProxy ← (String Function(Uri url)?)
设置用于解析打开到指定 url 的 HTTP 连接所使用的代理服务器的函数。如果此函数未设置,则始终使用直接连接。
无getter
hashCode int
此对象的哈希码。
no setterinherited
idleTimeout Duration
获取和设置非活动持久(保持连接)连接的空闲超时。
getter/setter对
keyLog ← (dynamic Function(String line)?)
设置一个回调函数,当与服务器交换新的 TLS 密钥时将被调用。它将接收每个调用的一行文本,格式为 NSS Key Log Format。将这些行写入文件将允许工具(如 Wireshark)解密此客户端与服务器之间的通信。这旨在允许对安全套接字进行网络级调试,不应在生产代码中使用。例如
无getter
maxConnectionsPerHost int?
获取和设置单个主机上的最大活动连接数。
getter/setter对
runtimeType Type
对象的运行时类型表示。
no setterinherited
userAgent String?
获取和设置此 HttpClient 生成的所有请求的默认 User-Agent 头部值的默认值。
getter/setter对

方法

addCredentials(Uri url, String realm, HttpClientCredentials credentials) → void
添加用于授权 HTTP 请求的凭据。
addProxyCredentials(String host, int port, String realm, HttpClientCredentials credentials) → void
添加用于授权 HTTP 代理的凭据。
close({bool force = false}) → void
关闭 HTTP 客户端。
delete(String host, int port, String path) Future<HttpClientRequest>
使用 DELETE 方法打开 HTTP 连接。
deleteUrl(Uri url) Future<HttpClientRequest>
使用 DELETE 方法打开 HTTP 连接。
get(String host, int port, String path) Future<HttpClientRequest>
使用GET方法打开HTTP连接。
getUrl(Uri url) Future<HttpClientRequest>
使用GET方法打开HTTP连接。
使用HEAD方法打开HTTP连接。
headUrl(Uri url) Future<HttpClientRequest>
使用HEAD方法打开HTTP连接。
noSuchMethod(Invocation invocation) → dynamic
当访问不存在的方法或属性时被调用。
继承
open(String method, String host, int port, String path) Future<HttpClientRequest>
打开HTTP连接。
openUrl(String method, Uri url) Future<HttpClientRequest>
打开HTTP连接。
patch(String host, int port, String path) Future<HttpClientRequest>
使用PATCH方法打开HTTP连接。
patchUrl(Uri url) Future<HttpClientRequest>
使用PATCH方法打开HTTP连接。
post(String host, int port, String path) Future<HttpClientRequest>
使用POST方法打开HTTP连接。
postUrl(Uri url) Future<HttpClientRequest>
使用POST方法打开HTTP连接。
put(String host, int port, String path) Future<HttpClientRequest>
使用PUT方法打开HTTP连接。
putUrl(Uri url) Future<HttpClientRequest>
使用PUT方法打开HTTP连接。
toString() String
此对象的字符串表示。
继承

运算符

operator ==(Object other) bool
等号运算符。
继承

静态属性

enableTimelineLogging bool
所有 HttpClient 向开发者时间轴的 HTTP 请求记录的当前状态。
getter/setter对

静态方法

findProxyFromEnvironment(Uri url, {Map<String, String>? environment}) String
从通过环境变量指定的代理配置中解析用于HTTP连接的代理服务器的函数。

常量

defaultHttpPort → const int
defaultHttpsPort → const int