Skip to content

接口调用

Dio

安装Dio:https://pub.dev/packages/dio

报错: Insecure HTTP is not allowed by platform

原因:平台不支持不安全的 HTTP 协议,即不允许访问 HTTP 域名的地址。

  • Android 解决
xml
<uses-permission android:name="android.permission.INTERNET" /> <!-- 添加这
一行 -->
<application
android:label="flutter_app"
android:usesCleartextTraffic="true" <!-- 添加这一行 -->
android:icon="@mipmap/ic_launcher">
  • iOS 解决

    打开 ios/Runner/Info.plist。添加如下代码:

<key>NSAppTransportSecurity</key>
  <dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
  </dict>

Dio 手册:https://github.com/flutterchina/dio/blob/master/README-ZH.md

初始化 Dio

我们把所有接口操作相关的代码都集中放到 api 目录下。例如:

bash
lib
|--api
|----initDio.dart 初始化 Dio
|----AdAPI.dart 广告 API
|----CourseAPI.dart 课程 API
|----UserAPI.dart 用户 API
|----OrderAPI.dart 订单 API
|----API.dart 所有 API(包括用户,订单,课程,广告等)

接下来,我们来创建具体的文件。首先,创建 lib/api/initDio.dart

dart
// dio 4.0
import 'package:dio/dio.dart';

Dio initDio() {
  BaseOptions _baseOptions = BaseOptions(
    baseUrl: 'http://edufront.lagounews.com/',
    connectTimeout: 5000,
  );

  // 初始化
  Dio dio = Dio(_baseOptions);

  // 添加拦截器
  dio.interceptors.add(
    InterceptorsWrapper(
      // 请求拦截
      onRequest: (RequestOptions options, RequestInterceptorHandler handler) {
        return handler.next(options);
      },
      // 响应拦截
      onResponse: (Response response, ResponseInterceptorHandler handler) {
        if (response.data == null || response.data['state'] != 1) {
          print('响应失败:'+response.data['message']);
          response.data = null;
        }
        return handler.next(response);
      },
      onError: (DioError error, ErrorInterceptorHandler handler) {
        return handler.next(error);
      }
    )
  );
  return dio;
}

使用 Dio

获取首页广告列表

创建 lib/api/AdAPI.dart

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

class AdAPI {
  final Dio _dio;

  AdAPI(this._dio);

  /// 广告列表
  Future<dynamic> adList({ String spaceKeys = '999' }) async {
    Response res = await _dio.get('/front/ad/getAllAds',
      queryParameters: {
        "spaceKeys": spaceKeys
      }
    );

    List adList = res.data['content'][0]['adDTOList'];
    return adList;
  }
}

创建 lib/api/API.dart

dart
import 'package:dio/dio.dart';
import 'initDio.dart';
import 'AdAPI.dart';

class API {
  late Dio _dio;

  API() {
    _dio = initDio();
  }

  /// 广告接口
  AdAPI get ad => AdAPI(_dio);
}

为了操作方便,我们可以把常用内容统一放到一个全局文件中

例如,创建 lib/utils/Global.dart。然后,把我们写好的接口放到 Global.dart 中。

dart
import 'package:flutter/material.dart';
import '../api/API.dart';

class G {
  /// 初始化 API
  static final API api = API();

}

在首页中调用接口 adList()

dart
import '../../utils/Global.dart';

class Home extends StatefulWidget {
  const Home({Key? key}) : super(key: key);

  @override
  State<Home> createState() => _HomeState();
}

class _HomeState extends State<Home> {
  List adList = [];
  @override
  void initState() {
    G.api.ad.adList().then((res) {
      print(res);
    });
    super.initState();
  }
  @override
  Widget build(BuildContext context) {
    return Container();
  }
}

Released under the MIT License.