Flutter 网络请求get与post的两个库

Flutter 网络请求get与post的两个库

<a href='/tag/flutter.html'>Flutter</a> 网络请求get与post的两个库

第一种:http库

https://pub.dev/packages/http

添加依赖
dependencies:http: ^0.12.0

安装http
flutter packages get

引用导入
import 'package:http/http.dart' as http;

常用方法

get(dynamic url, { Map<String, String> headers }) → Future<Response>


(必须)url:请求地址
(可选)headers:请求头
post(dynamic url, { Map<String, String> headers, dynamic body, Encoding encoding }) → Future<Response>
(必须)url:请求地址
(可选)headers:请求头
(可选)body:参数
(编码)Encoding:编码 

例子

http.post('https://flutter-cn.firebaseio.com/products.json',
            body: json.encode(param),encoding: Utf8Codec())
    .then((http.Response response) {
      final Map<String, dynamic> responseData = json.decode(response.body);
     //处理响应数据
     
    }).catchError((error) {
      print('$error错误');
});

返回值都用到Dart Futures, 类似JavaScript中的promise 官方推荐使用async/await来调用网络请求

  void addProduct(Product product) async {
    Map<String, dynamic> param = {
      'title': product.title,
      'description': product.description,
      'price': product.price
    };
    try {
      final http.Response response = await http.post(
          'https://flutter-cn.firebaseio.com/products.json',
          body: json.encode(param),
          encoding: Utf8Codec());

      final Map<String, dynamic> responseData = json.decode(response.body);
      print('$responseData 数据');
      
    } catch (error) {
      print('$error错误');
    }
  }

用 try catch来捕获错误 两种写法都可以,个人觉得第二种语法思路更明确.

第二种:dio库

https://github.com/flutterchina/dio

添加依赖

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

dependencies:
flutter:
sdk: flutter
dio: ^1.0.6

引入

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

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


{{collectdata}}

网友评论0