首页 > 其他分享 >flutter 使用 http 请求数据

flutter 使用 http 请求数据

时间:2023-06-04 10:07:37浏览次数:38  
标签:http String package Uri json flutter 请求

flutter 虽然有原生的 HttpClient ,package:http 对开发会更友好,这是官方推荐的网络请求模块。

安装 http package

fluter pub add http

在 android 文件夹下的 AndroidManifest.xml 文件,添加网络权限,

<uses-permission android:name="android.permission.INTERNET" />

构造 URI

因为 http package 需要 Uri,所以先了解一下。

uri 是 Uniform Resource Identifier的缩写,即是一个用于标识某一互联网资源名称的字符串。url 是 uri 的子集。uri 的表示范围更加广泛,可以包括但不限于 url 资源。

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
 );

path 和 pathSegments 都是用来生成 URI path,不同的是一个是直接给出,另一个分段给出,给出一个即可。实际上 path 会更常用。

query 和 queryParameters 都是用来生成 URI query,不同的是 query 直接给出,queryParameters 分段给出。两个给出一个即可,如果没有,可以全部为空。实际上 queryParameters 会更常用。

queryParameters 的 key 是一个字符串,value 部分有两种形式。

{"id":"1"}             Map<String,String>
{"ids":["1","2","3"]}  Map<String,Iterable<String>

fragment 是锚点。userInfo 可以忽略,一般不用到。

GET 请求

最简单的请求只需要一个参数 uri。

http.get(Uri.parse('https://jsonplaceholder.typicode.com/albums/1'));

还可以添加 header 比如 cookie

http.get(Uri.parse('https://jsonplaceholder.typicode.com/albums/1'),{
'cookie':'token=AC4REWD'
});

添加 header 的格式 Map<String, String> ,key 和 value都是字符串。

HEAD 请求

和 GET 请求用法相同。不同的是返回的内容没有 body。

POST 请求

最简单的请求需要两个参数 uri 和 body,因为如果只有 uri,用 GET 就好了。我们常用的 body 有两种格式

body 是一个字符串。比如 http 请求的请求体 是 "hello",请求的 content-type 默认为 "text/plain"。

http.post(Uri.parse,body:'hello');

body 是一个 Map, 请求的 content-type 是 "application/x-www-form-urlencoded",不能手动修改。

请求体的格式 Map<String, String>

http.post(Uri.parsebody:{'content':'hello','from':'faraway'});

还可以加 header,只要不在第一个位置就行。

http.post(Uri.parse,body:'hello',header:{'cookie':'token=AC4REWD'});

PUT 请求

和 POST 请求用法相同,但是对资源产生的影响不同。POST 产生的影响 非 幂等 ,PUT 产生的影响是 幂等 的。

服务端可能不支持 PUT 请求,所以更多时候,我们是用 POST 请求代替。

DELETE 请求

DELETE 请求的目的很明确,删除目标资源。多次请求产生的影响不变,所以 DELETE 请求也是幂等 的。

服务端可能不支持 DELETE 请求,所以更多时候,我们是用 POST 请求代替。

上传文件

前面讲的 GET,POST,PUT,DELETE 的请求包含的内容只是文本,当请求中有二进制内容时,我们用 MultipartRequest。 可以一次上传多个 Filds,可以有文本,也可以有文件。MultipartRequest 请求会自动设置 Content-Type header 为 multipart/form-data,并且不能被用户修改。

var uri = Uri.https('example.com', 'create');
var request = http.MultipartRequest('POST', uri)
  ..fields['user'] = '[email protected]'
  ..files.add(await http.MultipartFile.fromPath(
      'package', 'build/package.tar.gz',
      contentType: MediaType('application', 'x-tar')));
var response = await request.send();
if (response.statusCode == 200) print('Uploaded!');

field 相当于 key,服务端通过field 拿到需要的内容。

fields['user'] = '[email protected]' field 是 user,内容是 [email protected]

fromPath( 'package', 'build/package.tar.gz', contentType: MediaType('application', 'x-tar')),field 是 package,内容是文件 build/package.tar.gz 中的内容。contentType 是可选的。

设置超时

设置超时很简单,只需要加上在请求的后面加上 timeout。拿 GET 请求举例:

http.get(Uri.parse.timeout(Duration(microseconds: 1));;

为了让超时一定发生,设置超时时间为 1 微秒。超时后会抛出 TimeoutException。

timeout 方法返回一个新的 future,如果原来的 future 按时 complete,那么 新 future 返回原 future 的 value。如果失败,抛 TimeoutException。

timoute 方法 还可以有第二个参数 onTimeout,如果设置了 onTimeout,返回  T or  Future<T>

手动把 json 转换成 Dart 对象

通过 http package 拿到的数据还不能用。

先转成 json,再转成 dart 对象。

import 'dart:convert';

final response = await http
      .get(Uri.parse('https://jsonplaceholder.typicode.com/albums/1'));

if (response.statusCode == 200) {
  return Album.fromJson(jsonDecode(response.body));
} else {
  throw Exception('Failed to load album');
}

class Album {
  final int userId;
  final int id;
  final String title;

  const Album({
    required this.userId,
    required this.id,
    required this.title,
  });

  factory Album.fromJson(Map<String, dynamic> json) {
    return Album(
      userId: json['userId'],
      id: json['id'],
      title: json['title'],
    );
  }
}

用工具自动转 json 为 dart 对象

在线转 javiercbk.github.io/json_to_dar…

用在线转的方式比较灵活,先在线转出一个大致的类,然后再做少量修改。

dart 对象如何转成 json String?

只要给 类 加一个 toJson 方法,用 jsonEncode 方法就可以把一个对象转成 String

class Fruit {
 toJson(){
   return 'fruite';
 }
}
jsonEncode(Fruite()) // 输出:fruite

对于 toJson 返回的值具体是什么,jsonEncode是不会检查的,最后都会转成 String。比如

class Fruit {
 toJson(){
   return {"apple":1}
 }
}
jsonEncode(Fruite()) // 输出:{"apple":1}
class Fruit {
 toJson(){
   return [1,2,3];
 }
}
jsonEncode(Fruite()) // 输出:[1,2,3]

一般情况下我们都是返回 一个 Map,转成 String 后,正好是一个 json String。

参考

  • http package
  • fetch data
  • URI、URL、URN的关系
  • fromPath method

标签:http,String,package,Uri,json,flutter,请求
From: https://blog.51cto.com/JackieLion/6409928

相关文章

  • HTTP Boot(即基于HTTP的引导)是一种网络引导协议,它使用HTTP作为文件传输协议,支持远程引
    HTTPBoot(即基于HTTP的引导)是一种网络引导协议,它使用HTTP作为文件传输协议,支持远程引导、安装和部署操作系统和应用程序。与传统的PXE(PrebooteXecutionEnvironment)方式相比,HTTPBoot具有更高的灵活性、可扩展性和安全性。HTTPBoot可以通过以下步骤实现:启动计算机后,BIOS会向......
  • Flutter灵活布局要掌握的两个控件Expanded和Flexible
    Expanded和Flexible介绍在Flutter中,Expanded和Flexible是两个用于控制子组件尺寸的Widget,它们都可以用于实现灵活的布局。ExpandedWidget会自动将子组件的尺寸扩展到父组件剩余的空间,而FlexibleWidget则会自动调整子组件的尺寸以适应父组件的尺寸。具体来说,ExpandedWidget......
  • 【Python】如何在FastAPI中使用UUID标记日志,以跟踪一个请求的完整生命周期
    为什么要使用uuid标记日志?在分布式系统中,一个请求可能会经过多个服务,每个服务都会生成自己的日志。如果我们只使用普通的日志记录,那么很难将这些日志串联在一起,以至难以跟踪一个请求的完整生命周期。如果能够使用uuid标记日志,为每个请求生成一个唯一的uuid,且这个日志可以在不同......
  • HTTP Content-Security-Policy CSP策略
       CSP(ContentSecurityPolicy)内容安全策略是一个额外的安全层,用于检测并削弱某些特定类型的攻击,包括跨站脚本(XSS)和数据注入攻击等。无论是数据盗取,网站内容污染还是恶意软件分发,这些攻击都是主要的手段。   CSP被设计完全向后兼容,不支持CSP的浏览器也能与实现了......
  • HTTP Strict Transport Security HSTS
       HTTPStrict-Transport-Security(通常简称为HSTS)responseheader用来通知浏览器应该只通过HTTPS访问该站点,并且以后使用HTTP访问该站点的所有尝试都应自动重定向到HTTPS。 语法Strict-Transport-Security:max-age=<expire-time>Strict-Transport-Security:max-a......
  • HTTP的缓存机制是什么?
    HTTP缓存机制是一种在Web开发中常用的技术,它旨在提高性能和减少网络流量。通过缓存,可以避免不必要的网络请求,减少服务器负载,并加快页面加载速度。下面是关于HTTP缓存机制的详细介绍。HTTP缓存机制的基本原理是将Web资源(如HTML、CSS、JavaScript、图像等)保存在客户端或中间......
  • XMLHttpRequest实现下载文件的功能
    方式一:download("http://.....exportData",{name:"小明",age:18});functiondownload(url,data){varxhr=newXMLHttpRequest();//ajax的技术核心是XMLHttpRequest对象xhr.open("post",url);xhr.setRequestHeader("Cont......
  • 【代码片段】fasthttp 中的输出使用 gzip 压缩
    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!cnblogs博客zhihuGithub公众号:一本正经的瞎扯直接上代码:import("github.com/valyala/bytebufferpool""github.com/valyala/fasthttp")funcFasthttpHandler(ctx*fasthttp.RequestCtx){buf:......
  • Java使用SSLContext请求https
    //首先实现信任的管理器类ublic class HttpsUtil {     private static class TrustAnyTrustManager implements X509TrustManager {         public void checkClientTrusted(X509Certificate[] chain, String authType)          ......
  • 整合ChatGPT与Flutter高级技术
    整合ChatGPT与Flutter高级技术在当今快节奏的数字时代,人们对智能化应用的需求越来越高。ChatGPT是一种基于人工智能的语言模型,而Flutter是一种快速开发移动应用程序的框架。本文将介绍如何将这两种技术整合在一起,从而为用户提供更好的智能化移动应用体验。ChatGPT概述ChatGPT(Genera......