用于与 HTTP 服务器通信的 HTTP 客户端。
注意: 建议避免直接使用
HttpClient
发送 HTTP 请求。您可以通过IOClient
适配器以间接方式在package:http
中使用HttpClient
。使用更高层次的库,例如
package:http
,可让您以最小的代码更改切换实现。例如,package:http
的Client
有浏览器实现以及使用 Android 和 iOS 的平台原生 HTTP 客户端的实现。与HttpClient
不同,这些本地实现可与代理、VPN 等协同工作。
向 HTTP 服务器发送 HTTP 请求并接收响应。在多个对相同服务器的请求之间维护状态,包括会话cookie和其他cookie。
HttpClient
包含许多方法,可以发送 HttpClientRequest 到 Http 服务器并接收 HttpClientResponse。例如,您可以使用 get、getUrl、post 和 postUrl 方法分别进行 GET 和 POST 请求。
制作简单的 GET 请求:示例
getUrl
请求是两步过程,由两个 Future 触发。当第一个未来完成并带有 HttpClientRequest 时,底层网络连接已建立,但尚未发送数据。在第一个未来的回调函数中,可以在请求上设置 HTTP 头部和正文。请求对象的第一次写入或对 close 的调用都会将请求发送到服务器。
从服务器接收到 HTTP 响应后,由 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();
}
由 HttpClientRequest 的方法如 getUrl 和 open 创建未来。
HTTPS 连接
HttpClient
可以进行 HTTPS 请求,使用 TLS (SSL) 安全网络协议连接到服务器。如果服务器的证书由Mozilla编译的默认知名可信CA列表中的根CA(证书颁发机构)签名,则使用 https:方案调用 getUrl 将自动工作。
为了添加自定义可信证书颁发机构或向请求客户端证书的服务器发送客户端证书,将一个 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< Function(Uri url, String? proxyHost, int? proxyPort)?)Socket> > - 设置用于创建套接字连接的函数。没有getter
- connectionTimeout ↔ Duration?
- 获取和设置连接超时。getter/setter对
- findProxy ← (String Function(Uri url)?)
- 设置用于解析指定
url
中使用的代理服务器的函数。如果不设置此函数,将始终使用直接连接。没有getter - hashCode → int
- 此对象的哈希码。没有设置器继承的
- idleTimeout ↔ Duration
- 获取和设置空闲超时(非活动持久(keep-alive)连接)的空闲超时。getter/setter对
- keyLog ← (dynamic Function(String line)?)
- 设置一个回调函数,当与服务器交换新的 TLS 密钥时将被调用。对于每次调用,它将接收一行以 NSS 密钥日志格式 编写的文本。将这些行写入文件将允许工具(例如 Wireshark)解密客户端与服务器之间的通信。这是为了允许对安全套接字进行网络级调试,不应该在生产代码中使用。例如没有getter
- maxConnectionsPerHost ↔ int?
- 获取和设置对单个主机的最大活动连接数。getter/setter对
- runtimeType → Type
- 对象的运行时类型的表示。没有设置器继承的
- 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 代理的凭据。
-
关闭(
{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(
String host, int port, String path) → Future< HttpClientRequest> - 使用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对
静态方法
常量
- defaultHttpPort → const int
- defaultHttpsPort → const int