Flutter網(wǎng)絡(luò)請求

一. 網(wǎng)絡(luò)請求的方式

在Flutter中常見的網(wǎng)絡(luò)請求方式有三種:HttpClient巫湘、http庫哈雏、dio庫卓起;

1.1. HttpClient

HttpClient是dart自帶的請求類,在io包中盾饮,實現(xiàn)了基本的網(wǎng)絡(luò)請求相關(guān)的操作采桃。

網(wǎng)絡(luò)調(diào)用通常遵循如下步驟:

  1. 創(chuàng)建 client
  2. 構(gòu)造 Uri
  3. 發(fā)起請求懒熙,等待請求,同時您也可以配置請求headers普办、 body
  4. 關(guān)閉請求工扎,等待響應(yīng)
  5. 解碼響應(yīng)的內(nèi)容

網(wǎng)絡(luò)請求實例:

void requestNetwork() async {
  // 1.創(chuàng)建HttpClient對象
  final httpClient = HttpClient();

  // 2.構(gòu)建請求的uri
  final uri = Uri.parse("http://123.207.32.32:8000/api/v1/recommend");

  // 3.構(gòu)建請求
  final request = await httpClient.getUrl(uri);

  // 4.發(fā)送請求,必須
  final response = await request.close();
  if (response.statusCode == HttpStatus.ok) {
    print(await response.transform(utf8.decoder).join());
  } else {
    print(response.statusCode);
  }
}

其實HttpClient也可以發(fā)送post相關(guān)的請求衔蹲,我們這里就不再演練肢娘。

HttpClient雖然可以發(fā)送正常的網(wǎng)絡(luò)請求,但是會暴露過多的細(xì)節(jié):比如需要主動關(guān)閉request請求舆驶,拿到數(shù)據(jù)后也需要手動的進(jìn)行字符串解碼橱健。

在開發(fā)中,我們一般很少直接面向HttpClient進(jìn)行網(wǎng)絡(luò)請求沙廉,而是使用一些庫來完成畴博。

1.2. http庫

http 是 Dart 官方提供的另一個網(wǎng)絡(luò)請求類,相比于 HttpClient蓝仲,易用性提升了不少。但是官疲,沒有默認(rèn)集成到Dart的SDK中袱结,所以我們需要先在pubspec中依賴它:

http: ^0.12.0+2

導(dǎo)入并且使用即可:

import 'package:http/http.dart' as http;

void httpNetwork() async {
  // 1.創(chuàng)建Client
  final client = http.Client();

  // 2.構(gòu)建uri
  final url = Uri.parse("http://123.207.32.32:8000/api/v1/recommend");

  // 3.發(fā)送請求
  final response = await client.get(url);

  // 4.獲取結(jié)果
  if (response.statusCode == HttpStatus.ok) {
    print(response.body);
  } else {
    print(response.statusCode);
  }
}

1.3. dio三方庫

官方提供的HttpClient和http都可以正常的發(fā)送網(wǎng)絡(luò)請求,但是對于現(xiàn)代的應(yīng)用程序開發(fā)來說途凫,我們通常要求的東西會更多:比如攔截器垢夹、取消請求、文件上傳/下載维费、超時設(shè)置等等果元;

這個時候,我們可以使用一個在Flutter中非常流行的三方庫:dio犀盟,官網(wǎng)有對dio進(jìn)行解釋:

dio是一個強(qiáng)大的Dart Http請求庫而晒,支持Restful API、FormData阅畴、攔截器倡怎、請求取消、Cookie管理贱枣、文件上傳/下載监署、超時、自定義適配器等...

使用dio三方庫必然也需要先在pubspec中依賴它:

dio: ^3.0.1

終端執(zhí)行pub get纽哥,導(dǎo)入并使用:

import 'package:dio/dio.dart';

void dioNetwork() async {
  // 1.創(chuàng)建Dio請求對象
  final dio = Dio();

  // 2.發(fā)送網(wǎng)絡(luò)請求
  final response = await dio.get("http://123.207.32.32:8000/api/v1/recommend");

  // 3.打印請求結(jié)果
  if (response.statusCode == HttpStatus.ok) {
    print(response.data);
  } else {
    print("請求失斈品Α:${response.statusCode}");
  }
}

補(bǔ)充:一個很好用的網(wǎng)站:https://httpbin.org/get,后面跟get春塌、post等可以測試網(wǎng)絡(luò)庫的使用晓避。

1.4. dio庫的封裝

http_config.dart文件:

class HttpConfig {
  static const String baseURL = "https://httpbin.org";
  static const int timeout = 5000;
}

http_request.dart文件:

import 'package:dio/dio.dart';
import 'package:testflutter001/service/http_config.dart';

class HttpRequest {
  static final BaseOptions options = BaseOptions(
      baseUrl: HTTPConfig.baseURL, connectTimeout: HTTPConfig.timeout);
  static final Dio dio = Dio(options);

  static Future<T> request<T>(String url,
      {String method = 'get', Map<String, dynamic> params, Interceptor inter}) async {
    // 1.請求的單獨配置
    final options = Options(method: method);

    // 2.添加攔截器
    Interceptor dInter = InterceptorsWrapper(
      onRequest: (RequestOptions options) {
        // 1.在進(jìn)行任何網(wǎng)絡(luò)請求的時候, 可以添加一個loading顯示
        // 2.很多頁面的訪問必須要求攜帶Token,那么就可以在這里判斷是有Token
        // 3.對參數(shù)進(jìn)行一些處理,比如序列化處理等
        print("攔截了請求");
        return options;
      },
      onResponse: (Response response) {
        print("攔截了響應(yīng)");
        return response;
      },
      onError: (DioError error) {
        print("攔截了錯誤");
        return error;
      }
    );

    List<Interceptor> inters = [dInter];

    // 添加用戶傳的攔截器
    if (inter != null) {
      inters.add(inter);
    }
    // 統(tǒng)一添加攔截器
    dio.interceptors.addAll(inters);

    // 3.發(fā)送網(wǎng)絡(luò)請求
    try {
      Response response = await dio.request<T>(url, queryParameters: params, options: options);
      return response.data;
    } on DioError catch(e) {
      return Future.error(e);
    }
  }
}

代碼使用:

HttpRequest.request("https://httpbin.org/get", params: {"name": "why", 'age': 18}).then((res) {
  print(res);
});

HttpRequest.request("https://httpbin.org/post",
                    method: "post", params: {"name": "why", 'age': 18}).then((res) {
  print(res);
});
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末簇捍,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子够滑,更是在濱河造成了極大的恐慌垦写,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件彰触,死亡現(xiàn)場離奇詭異梯投,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)况毅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門分蓖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人尔许,你說我怎么就攤上這事么鹤。” “怎么了味廊?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵蒸甜,是天一觀的道長。 經(jīng)常有香客問我余佛,道長柠新,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任辉巡,我火速辦了婚禮恨憎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘郊楣。我一直安慰自己憔恳,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布净蚤。 她就那樣靜靜地躺著钥组,像睡著了一般。 火紅的嫁衣襯著肌膚如雪今瀑。 梳的紋絲不亂的頭發(fā)上者铜,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機(jī)與錄音放椰,去河邊找鬼作烟。 笑死,一個胖子當(dāng)著我的面吹牛砾医,可吹牛的內(nèi)容都是我干的拿撩。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼如蚜,長吁一口氣:“原來是場噩夢啊……” “哼压恒!你這毒婦竟也來了影暴?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤探赫,失蹤者是張志新(化名)和其女友劉穎型宙,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體伦吠,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡妆兑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了毛仪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片搁嗓。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖箱靴,靈堂內(nèi)的尸體忽然破棺而出腺逛,到底是詐尸還是另有隱情,我是刑警寧澤衡怀,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布棍矛,位于F島的核電站,受9級特大地震影響抛杨,放射性物質(zhì)發(fā)生泄漏够委。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一蝶桶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧掉冶,春花似錦真竖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至璧亚,卻和暖如春讨韭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背癣蟋。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工透硝, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人疯搅。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓濒生,卻偏偏與公主長得像,于是被迫代替她去往敵國和親幔欧。 傳聞我的和親對象是個殘疾皇子罪治,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容