九:Flutter網(wǎng)絡(luò)請(qǐng)求

本文介紹的步驟:在Flutter中常見的網(wǎng)絡(luò)請(qǐng)求方式有三種:HttpClient寒屯、http庫荐捻、dio庫

一:httpClient
二:http
三:dio三方庫
一:httpClient

httpClientdart自帶的請(qǐng)求類,在io包中寡夹,實(shí)現(xiàn)了基本的網(wǎng)絡(luò)請(qǐng)求相關(guān)的操作处面。

// 一般需要導(dǎo)入這三個(gè)
import 'dart:convert';  //  utf8.decoder
import 'dart:io'; // 用到 HttpClient請(qǐng)求?式 需要導(dǎo)入
import 'dart:async'; // 異步

  getHttpClient() async {
    var httpClient = new HttpClient();
    var url = 'https://randomuser.me/api/?results=30';
    var request = await httpClient.getUrl(Uri.parse(url));
    var response = await request.close();
    var jsonString = await response.transform(utf8.decoder).join();
    // ignore: avoid_print
    print('數(shù)據(jù):${jsonString}');
  }

OK,其實(shí)HttpClient也可以發(fā)送post相關(guān)的請(qǐng)求菩掏,我們這里就不再演練魂角。
HttpClient雖然可以發(fā)送正常的網(wǎng)絡(luò)請(qǐng)求,但是會(huì)暴露過多的細(xì)節(jié):

比如需要主動(dòng)關(guān)閉request請(qǐng)求智绸,拿到數(shù)據(jù)后也需要手動(dòng)的進(jìn)行字符串解碼
在開發(fā)中野揪,我們一般很多直接面向HttpClient進(jìn)行網(wǎng)絡(luò)請(qǐng)求访忿,而是使用一些庫來完成。

二:http

httpDart 官方提供的另一個(gè)網(wǎng)絡(luò)請(qǐng)求類斯稳,相比于HttpClient海铆,易用性提升了不少。
但是挣惰,沒有默認(rèn)集成到DartSDK中卧斟,所以我們需要先在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ā)送請(qǐng)求
 final response = await client.get(url);
 // 4.獲取結(jié)果
 if (response.statusCode == HttpStatus.ok) {
    print(response.body);
 } else {
    print(response.statusCode);
 }
} 
三:dio三方庫

官方提供的HttpClienthttp都可以正常的發(fā)送網(wǎng)絡(luò)請(qǐng)求,但是對(duì)于現(xiàn)代的應(yīng)用程序開發(fā)來說憎茂,我們通常要求的東西會(huì)更多:比如攔截器珍语、取消請(qǐng)求、文件上傳/下載竖幔、超時(shí)設(shè)置等等板乙;
這個(gè)時(shí)候,我們可以使用一個(gè)在Flutter中非常流行的三方庫:dio拳氢;
dio是一個(gè)強(qiáng)大的Dart Http請(qǐng)求庫募逞,支持Restful API、FormData饿幅、攔截器凡辱、請(qǐng)求取消、Cookie管理栗恩、文件上傳/下載透乾、超時(shí)、自定義適配器等...

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

dio: ^4.0.4
// 代碼演練:
import 'package:dio/dio.dart'; 
import 'dart:convert';
import 'dart:async';

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

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

 // 3.打印請(qǐng)求結(jié)果
 if (response.statusCode == HttpStatus.ok) {
   print(response.data);
 } else {
   print("請(qǐng)求失斂某印:${response.statusCode}");
 }
} 

dio庫的封裝
1乳乌,實(shí)現(xiàn)封裝

import 'package:dio/dio.dart';
import 'dart:convert';
import 'dart:async';

/// dio網(wǎng)絡(luò)請(qǐng)求配置表 自定義
class DioConfig {
  static const baseURL = 'http://117.34.71.31:8081/paas-admin'; //域名
  static const timeout = 10000; //超時(shí)時(shí)間
} 
// 網(wǎng)絡(luò)請(qǐng)求工具類
class DioRequest {
  late Dio dio;
  static DioRequest? _instance;
  /// 構(gòu)造函數(shù)
  DioRequest() {
    dio = Dio();
    dio.options = BaseOptions(
        baseUrl: DioConfig.baseURL,
        connectTimeout: DioConfig.timeout,
        sendTimeout: DioConfig.timeout,
        receiveTimeout: DioConfig.timeout,
        contentType: 'application/json; charset=utf-8',
        headers: {});
    /// 請(qǐng)求攔截器 and 響應(yīng)攔截機(jī) and 錯(cuò)誤處理
    dio.interceptors.add(InterceptorsWrapper(onRequest: (options, handler) {
      print("\n================== 請(qǐng)求數(shù)據(jù) ==========================");
      print("url = ${options.uri.toString()}");
      print("headers = ${options.headers}");
      print("params = ${options.data}");
      return handler.next(options);
    }, onResponse: (response, handler) {
      print("\n================== 響應(yīng)數(shù)據(jù) ==========================");
      print("code = ${response.statusCode}");
      print("data = ${response.data}");
      print("\n");
      handler.next(response);
    }, onError: (DioError e, handler) {
      print("\n================== 錯(cuò)誤響應(yīng)數(shù)據(jù) ======================");
      print("type = ${e.type}");
      print("message = ${e.message}");
      print("\n");
      return handler.next(e);
    }));
  }
  static DioRequest getInstance() {
    return _instance ??= DioRequest();
  }
}

2,統(tǒng)一請(qǐng)求服務(wù)

import 'dart:convert';
import 'dart:async';
import 'package:cyber_security/utils/http.dart';

class LoginService {
  /// 獲取用戶數(shù)據(jù)中心列表
  static Future<List> getDataCenter() async {
    var response = await DioRequest.getInstance().dio.get('/getDataCenter');
    var data = jsonDecode(response.toString());
    return data['dataCenterList'];
  }

  /// 登錄接口
  static login(value) async {
    var response = await DioRequest.getInstance()
        .dio
        .post('/sys/login', queryParameters: value);
    var data = jsonDecode(response.toString()); 
    /// 對(duì)返回的身份憑證全局持久化存儲(chǔ)
    return data['key'];
  }

  /// 獲取權(quán)限列表
  static menuNav() async {
    var response = await DioRequest.getInstance().dio.get('/sys/menu/nav');
    var data = jsonDecode(response.toString());
    return data['key'];
  }
}

3市咆,發(fā)起請(qǐng)求

@override
  void initState() {
    // TODO: implement initState
    super.initState();
    /// 請(qǐng)求用戶數(shù)據(jù)中心數(shù)據(jù)
    LoginService.getDataCenter().then((value) {
      setState(() {
        _dataCenterList = value;
      });
    });
  }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末汉操,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蒙兰,更是在濱河造成了極大的恐慌磷瘤,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件搜变,死亡現(xiàn)場(chǎng)離奇詭異采缚,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)挠他,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門扳抽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事贸呢×眨” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵楞陷,是天一觀的道長(zhǎng)怔鳖。 經(jīng)常有香客問我,道長(zhǎng)猜谚,這世上最難降的妖魔是什么败砂? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任赌渣,我火速辦了婚禮魏铅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘坚芜。我一直安慰自己览芳,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布鸿竖。 她就那樣靜靜地躺著沧竟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪缚忧。 梳的紋絲不亂的頭發(fā)上悟泵,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音闪水,去河邊找鬼糕非。 笑死,一個(gè)胖子當(dāng)著我的面吹牛球榆,可吹牛的內(nèi)容都是我干的朽肥。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼持钉,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼衡招!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起每强,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤始腾,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后空执,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體浪箭,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年脆烟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了山林。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖驼抹,靈堂內(nèi)的尸體忽然破棺而出桑孩,到底是詐尸還是另有隱情,我是刑警寧澤框冀,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布流椒,位于F島的核電站,受9級(jí)特大地震影響明也,放射性物質(zhì)發(fā)生泄漏宣虾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一温数、第九天 我趴在偏房一處隱蔽的房頂上張望绣硝。 院中可真熱鬧,春花似錦撑刺、人聲如沸鹉胖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽甫菠。三九已至,卻和暖如春冕屯,著一層夾襖步出監(jiān)牢的瞬間寂诱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工安聘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留痰洒,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓搞挣,卻偏偏與公主長(zhǎng)得像带迟,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子囱桨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

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