Flutter-網(wǎng)絡(luò)請(qǐng)求框架

我現(xiàn)在采用的網(wǎng)絡(luò)框架是基于dio的。
線上工具類:

import 'package:dio/dio.dart';
import 'package:http_parser/http_parser.dart';
import 'package:yxk_app/constant/functions.dart';
import 'package:yxk_app/net/request_api.dart';
import 'package:yxk_app/utils/data_utils.dart';
import 'package:yxk_app/utils/log_utils.dart';

/// 網(wǎng)絡(luò)請(qǐng)求
class RequstUtil {
  // token值
  static String token;

  // 初始化
  static final Dio _dio = new Dio(new BaseOptions(
      method: RequestApi.methodGet,
      baseUrl: RequestApi.baseUrl,
      connectTimeout: RequestApi.connectTimeout,
      receiveTimeout: RequestApi.receiveTimeout,
      followRedirects: true));

  /// 請(qǐng)求
  ///
  /// 必填字段:
  /// method 請(qǐng)求方法酣胀,如 RequestApi.methodGet
  /// uri 請(qǐng)求地址
  /// isBody 表單格式為false刁赦、json格式為true
  ///
  /// 可選字段:
  /// key 服務(wù)端返回?cái)?shù)據(jù)中需要取得字段娶聘,不設(shè)置的話默認(rèn)是同級(jí)code的data值
  /// responceSuccess 返回成功數(shù)據(jù)回調(diào)
  /// responceError 返回失敗數(shù)據(jù)回調(diào)
  static doRequest(String method, String uri, bool isBody,
      {Map<String, dynamic> body,
      String key,
      ResponceSuccess responceSuccess,
      ResponceError responceError}) async {
    _httpJson(method, uri, isBody, data: body).then((resp) {
      doResponse(resp,
          key: key,
          responceSuccess: responceSuccess,
          responceError: responceError);
    });
  }

  /// 文件上傳  返回json數(shù)據(jù)為字符串
  static Future putFile(String uri, String filePath,
      {ResponceSuccess responceSuccess, ResponceError responceError}) {
    String name =
        filePath.substring(filePath.lastIndexOf("/") + 1, filePath.length);

    FormData formData = FormData.fromMap({
      "multipartFile": MultipartFile.fromFile(filePath,
          filename: name, contentType: MediaType.parse("multipart/form-data")),
    });

    var enToken = token == null ? "" : Uri.encodeFull(token);
    return _dio
        .put<Map<String, dynamic>>("$uri?token=$enToken", data: formData)
        .then((resp) {
      doResponse(resp,
          responceSuccess: responceSuccess, responceError: responceError);
    });
  }

  /// 請(qǐng)求數(shù)據(jù)
  static Future<Response<Map<String, dynamic>>> _httpJson(
      String method, String uri, bool isBody,
      {Map<String, dynamic> data}) {
    Log.d('請(qǐng)求地址:$uri\n請(qǐng)求參數(shù):$data');

    Options op = Options(method: method, headers: {
      "Content-Type": "application/json",
      "Accept": "application/json"
    });

    if (isBody) {
      return _dio.request<Map<String, dynamic>>(uri,
          data: data ?? Map<String, dynamic>(), options: op);
    } else {
      return _dio.request<Map<String, dynamic>>(uri,
          queryParameters: data ?? Map<String, dynamic>(), options: op);
    }
  }

  /// 返回?cái)?shù)據(jù)統(tǒng)一處理
  static void doResponse(Response<Map<String, dynamic>> resp,
      {String key,
      ResponceSuccess responceSuccess,
      ResponceError responceError}) {
    LogicError error = LogicError("-1", "未知異常");

    // 打印日志
    Log.d('返回?cái)?shù)據(jù):$resp');

    // 回調(diào)監(jiān)聽
    if (null != resp.data && null != resp.data['code']) {
      if (resp.data["code"] == "0" || resp.data["code"] == "200") {
        // 成功
        if (null != responceSuccess)
          responceSuccess(
              !StringUtils.isEmpty(key) ? resp.data["data"][key] : resp.data);
        return;
      } else {
        // 失敗
        error = new LogicError(resp.data["code"], resp.data['msg']);

        /// token失效 重新登錄  后端定義的code碼
        if (resp.data["code"] == RequestApi.tokenIllegalCode) {
          // todo 退出登錄界面

        }
      }
    }
    if (null != responceError) responceError(error);
  }
}

/// 異常類
class LogicError {
  final String errorCode;
  final String msg;

  LogicError(this.errorCode, this.msg);
}

enum PostType { json, form, file }

api相關(guān)類:

/// 請(qǐng)求api
class RequestApi {
  /// 方法
  static final String methodGet = "get";
  static final String methodPost = "post";
  static final String methodPut = "put";
  static final String methodDellete = "delete";

  /// 網(wǎng)絡(luò)請(qǐng)求配置信息
  static final String baseUrl = "${基礎(chǔ)域名}"; // 基礎(chǔ)域名
  static final int connectTimeout = 10 * 1000; // 連接超時(shí)時(shí)間
  static final int receiveTimeout = 10 * 1000; // 接收超時(shí)時(shí)間

  /// 錯(cuò)誤信息
  static final String tokenIllegalCode = "-99"; // token失效code碼

  /// 接口
  static String login = "${你自己的接口}"; // 用戶登錄
}

整體比較簡(jiǎn)單,注釋也很全了甚脉,錯(cuò)誤異常是一個(gè)異常類丸升,正常的返回可能存在bool、String宦焦、Object发钝、Map、List等等類型波闹,這些自己可以采用dynamic提取最終數(shù)據(jù)酝豪,然后直接轉(zhuǎn)換就可以了,也比較簡(jiǎn)單精堕。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末孵淘,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子歹篓,更是在濱河造成了極大的恐慌瘫证,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件庄撮,死亡現(xiàn)場(chǎng)離奇詭異背捌,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)洞斯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門毡庆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人烙如,你說我怎么就攤上這事么抗。” “怎么了亚铁?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵蝇刀,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我徘溢,道長(zhǎng)吞琐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任然爆,我火速辦了婚禮顽分,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘施蜜。我一直安慰自己,他們只是感情好雌隅,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布翻默。 她就那樣靜靜地躺著缸沃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪修械。 梳的紋絲不亂的頭發(fā)上趾牧,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音肯污,去河邊找鬼翘单。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蹦渣,可吹牛的內(nèi)容都是我干的哄芜。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼柬唯,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼认臊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起锄奢,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤失晴,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后拘央,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體涂屁,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年灰伟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拆又。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡袱箱,死狀恐怖遏乔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情发笔,我是刑警寧澤盟萨,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站了讨,受9級(jí)特大地震影響捻激,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜前计,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一胞谭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧男杈,春花似錦丈屹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽彩库。三九已至,卻和暖如春先蒋,著一層夾襖步出監(jiān)牢的瞬間骇钦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國(guó)打工竞漾, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留眯搭,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓业岁,卻偏偏與公主長(zhǎng)得像鳞仙,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子叨襟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

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