Flutter网络请求插件requests的使用

发布于 1周前 作者 h691938207 来自 Flutter

Flutter网络请求插件requests的使用

banner-01

Version License

requests 是一个受Python requests 模块启发的Dart库,用于发起HTTP请求。它支持JSON,并且可以像浏览器一样存储和发送Cookie。

安装

在您的pubspec.yaml文件中添加以下依赖:

dependencies:
  requests: ^4.7.0

使用方法

导入库

首先导入requests库:

import 'package:requests/requests.dart';

发起简单的HTTP请求

var r = await Requests.get('https://google.com');
r.raiseForStatus();
String body = r.content();

Response对象

Response对象提供了以下功能:

  • r.throwForStatus()r.raiseForStatus():如果响应状态码不是成功的,则抛出异常。
  • r.statusCode:响应状态码。
  • r.url:请求的URL。
  • r.headers:响应头。
  • r.success:布尔值,表示请求是否成功。
  • r.hasError:布尔值,表示请求是否失败。
  • r.bytes():返回响应体作为字节列表。
  • r.content():返回响应体作为字符串。
  • r.json():解码响应体并返回结果(动态类型)。

可选参数

您可以使用以下可选参数:

  • json:将被JSON编码并设置为请求体的dynamic对象。
  • body:用作请求体的原始字符串。
  • bodyEncoding:默认为RequestBodyEncoding.FormURLEncoded,将设置content-type头。
  • headers:自定义客户端头的Map<String, String>
  • timeoutSeconds:默认为10秒,超过该时间未收到服务器响应则抛出异常。
  • persistCookies:默认为true,是否遵循服务器指令保存Cookie。
  • verify:默认为true,是否启用SSL验证。
  • withCredentials:默认为false,用于处理Web端的Cookie、授权头或TLS客户端证书。

💡 注意:一次请求只能使用bodyjson中的一个。

类方法

  • .getHostname(url):返回给定URL的主机名。
  • .clearStoredCookies(hostname):清除指定主机名的存储Cookie。
  • .setStoredCookies(hostname, CookieJar):设置指定主机名的存储Cookie。
  • .getStoredCookies(hostname):返回指定主机名的存储Cookie。
  • .addCookie(hostname, name, value):向指定主机名的CookieJar中添加Cookie。

示例代码

HTTP POST请求,解析响应为JSON

var r = await Requests.post(
  'https://reqres.in/api/users',
  body: {
    'userId': 10,
    'id': 91,
    'title': 'aut amet sed',
  },
  bodyEncoding: RequestBodyEncoding.FormURLEncoded);

r.raiseForStatus();
dynamic json = r.json();
print(json!['id']);

HTTP DELETE请求

var r = await Requests.delete('https://reqres.in/api/users/10');
r.raiseForStatus();

忽略自签名SSL证书

var r = await Requests.get('https://expired.badssl.com/', verify: false);
r.raiseForStatus();

管理存储的Cookie

String url = "https://example.com";
String hostname = Requests.getHostname(url);
await Requests.clearStoredCookies(hostname);

// 使用CookieJar.parseCookiesString设置Cookie
var cookies = CookieJar.parseCookiesString("name=value");
await Requests.setStoredCookies(hostname, cookies);

// 使用Requests.addCookie添加单个Cookie
Requests.addCookie(hostname, "name", "value");

完整示例

以下是一个完整的示例,展示了如何使用requests插件查询Google Books API:

import 'package:requests/requests.dart';

void main(List<String> arguments) async {
  // 使用Google Books API搜索关于requests的书籍
  var url = 'https://www.googleapis.com/books/v1/volumes?q=requests';

  try {
    // 发起GET请求并等待响应
    var response = await Requests.get(url);
    
    // 检查响应状态码
    if (response.statusCode == 200) {
      // 解析JSON格式的响应
      var jsonResponse = response.json();
      var itemCount = jsonResponse["totalItems"];
      print('找到关于requests的书籍数量: $itemCount.');
    } else {
      print('请求失败,状态码: ${response.statusCode}');
    }
  } catch (e) {
    print('请求过程中发生错误: $e');
  }
}

更多示例可以在GitHub仓库的example目录中找到。


更多关于Flutter网络请求插件requests的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter网络请求插件requests的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,虽然没有一个直接名为 requests 的官方插件用于网络请求,但通常我们会使用 diohttp 等流行的第三方库来执行网络请求。下面我将展示如何使用 dio 库来进行网络请求,因为它在Flutter社区中非常受欢迎且功能强大。

首先,你需要在你的 pubspec.yaml 文件中添加 dio 依赖:

dependencies:
  flutter:
    sdk: flutter
  dio: ^4.0.4  # 请检查最新版本号

然后,运行 flutter pub get 来获取依赖。

接下来,你可以在你的 Flutter 应用中使用 dio 来执行网络请求。下面是一个简单的示例,展示了如何发送 GET 和 POST 请求:

import 'package:flutter/material.dart';
import 'package:dio/dio.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Network Requests with Dio'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              ElevatedButton(
                onPressed: () async {
                  // 发送 GET 请求
                  try {
                    Response response = await Dio().get('https://jsonplaceholder.typicode.com/posts/1');
                    print(response.data);
                    // 在这里处理响应数据,例如更新UI
                  } catch (e) {
                    print('GET 请求错误: $e');
                  }
                },
                child: Text('发送 GET 请求'),
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: () async {
                  // 发送 POST 请求
                  var data = FormData.fromMap({
                    'title': 'foo',
                    'body': 'bar',
                    'userId': 1,
                  });

                  try {
                    Response response = await Dio().post('https://jsonplaceholder.typicode.com/posts', data: data);
                    print(response.data);
                    // 在这里处理响应数据,例如更新UI
                  } catch (e) {
                    print('POST 请求错误: $e');
                  }
                },
                child: Text('发送 POST 请求'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的 Flutter 应用,其中有两个按钮,一个用于发送 GET 请求,另一个用于发送 POST 请求。GET 请求访问了一个示例 API,该 API 返回一个具体的帖子。POST 请求向同一个 API 发送了一些表单数据。

注意事项

  1. 错误处理:在实际应用中,你应该更加细致地处理网络错误,例如重试逻辑、用户通知等。
  2. 环境配置:对于不同的环境(如开发、测试、生产),你可能需要配置不同的 API 端点。可以使用 .env 文件或类似的配置管理工具。
  3. 安全性:确保你的网络请求是安全的,特别是当涉及到敏感信息(如用户凭证)时。考虑使用 HTTPS 和适当的身份验证机制。

通过上述代码,你可以快速上手在 Flutter 中使用 dio 库进行网络请求。如果你需要更高级的功能,如文件上传、下载、取消请求等,dio 的文档提供了详细的说明和示例。

回到顶部