Flutter POST/GET网络请求

作者: Mystical | 来源:发表于2018-11-15 16:41 被阅读592次

    前言

    在开发中避免不了从服务器获取数据,在写网络请求时,我们通常会使用一些第三方库来更优雅的解决问题,例如iOS中的AFNetworking,Android中的OKHttp。在Flutter中网络请求,我使用到的是dio,GitHub地址。这是由Flutter中文网开发的一个开源网络请求库。

    实践

    首先我们需要集成dio,在pubspec.yaml文件中添加dio(注意格式):

    dependencies:
      flutter:
        sdk: flutter
      dio: ^1.0.6
    

    接下来我们对dio进行封装
    1、导入dio包

    import 'package:dio/dio.dart';
    import 'package:worker_sp/model/Api.dart';// 这个包为自定义Api地址
    

    2、开始对dio进行封装

    import 'package:dio/dio.dart';
    import 'package:worker_sp/model/Api.dart';
    import 'dart:io';
    
    class NetService {
      static const String Base_URL = Api.Base_Url;
      static const String GET = 'GET';
      static const String POST = 'POST';
    
      //get请求
      static void get(String url, Function successCallBack,
          {Map<String, String> params, Function errorCallBack}) {
        _request(url, successCallBack,
            method: GET, params: params, errorCallBack: errorCallBack);
      }
    
      //post请求
      static void post(String url, Function successCallBack,
          {Map<String, String> params, Function errorCallBack}) {
        _request(url, successCallBack,
            method: POST, params: params, errorCallBack: errorCallBack);
      }
    
      // 请求部分
      static void _request(String url, Function callBack,
          {String method, Map<String, String> params, Function errorCallBack}) async {
        String errorMsg = "";
        int statusCode;
    
        try {
          Response response;
          Options options= new Options(
            // 15s 超时时间
            connectTimeout:15000,
            receiveTimeout:15000,
            baseUrl: Base_URL,
          // dio库中默认将请求数据序列化为json,此处可根据后台情况自行修改
            contentType: new ContentType('application', 'x-www-form-urlencoded',charset: 'utf-8')
          );
          Dio dio = new Dio(options);
    
          if (method == GET) {
            response = await dio.get(url,data: params);
          } else {
            response = await dio.post(url,data: params);
          }
          statusCode = response.statusCode;
          //处理错误部分
          if (statusCode < 0) {
            errorMsg = "网络请求错误,状态码:" + statusCode.toString();
            _handError(errorCallBack, errorMsg);
            return;
          }
    
          if (callBack != null) {
            callBack(response);
            print(response.statusCode);
          }
        } catch (exception) {
          _handError(errorCallBack, exception.toString());
        }
      }
      //处理异常
      static void _handError(Function errorCallback, String errorMsg) {
        if (errorCallback != null) {
          errorCallback(errorMsg);
        }
      }
    }
    
    注:在iOS中,允许使用http请求时,需要在plist文件中添加以下内容
    <key>NSAppTransportSecurity</key>
        <dict>
            <key>NSAllowsArbitraryLoadsInWebContent</key>
            <true/>
            <key>NSAllowsArbitraryLoads</key>
            <true/>
        </dict>
    

    目前在使用中暂时只使用到GET/POST请求,后续使用到文件上传等其他内容会继续更新。

    文章内容有不正确的地方,请指正。感谢!

    相关文章

      网友评论

        本文标题:Flutter POST/GET网络请求

        本文链接:https://www.haomeiwen.com/subject/btjjfqtx.html