flutter 阿里云盘API调用

flutter 阿里云盘API调用

import 'dart:convert';
import 'dart:io';

import 'package:http/http.dart' as http;


class YunPanUpload {
  final aliPanHost = "https://openapi.alipan.com";

  //获取用户信息
  Future<Map<String, dynamic>> getUserInfo(accessToken) async {
    final resp =
        await http.get(Uri.parse('$aliPanHost/oauth/users/info'), headers: {
      'Authorization': 'Bearer $accessToken',
    });
    Map<String, dynamic> map = jsonDecode(resp.body);
    return map;
  }

  //获取用户drive信息
  Future<Map<String, dynamic>> getDriverInfo(accessToken) async {
    final resp = await http.post(
      Uri.parse("$aliPanHost/adrive/v1.0/user/getDriveInfo"),
      headers: {
        'Content-Type': 'application/json',
        'Authorization': 'Bearer $accessToken',
      },
    );
    Map<String, dynamic> json = jsonDecode(resp.body);
    return json;
  }

  //创建文件
  Future<Map<String, dynamic>> createFile(accessToken,Map<String,dynamic> body) async {
    final resp = await http.post(
      Uri.parse("$aliPanHost/adrive/v1.0/openFile/create"),
      headers: {
        'Content-Type': 'application/json',
        'Authorization': 'Bearer $accessToken',
      },
      body: jsonEncode(body)
    );
    Map<String, dynamic> json = jsonDecode(resp.body);
    return json;
  }

  //造多级文件夹
  Future<Map<String, dynamic>> createDir(accessToken,drive_id) async{
    final date = DateTime.now();
    int year = date.year;
    int month = date.month;
    int day = date.day;
    final path = "snapshot";
    Map<String,dynamic> bodyf = {
      'drive_id': drive_id,
      'parent_file_id': "root",
      'name': path,
      'type': 'folder',
      'check_name_mode': "refuse",
    };
    final uploadInfof = await createFile(accessToken,bodyf);
    bodyf['parent_file_id'] = uploadInfof['file_id'];
    bodyf['name'] = year;
    final uploadInfof2 = await createFile(accessToken,bodyf);
    bodyf['parent_file_id'] = uploadInfof2['file_id'];
    bodyf['name'] = month;
    final uploadInfof3 = await createFile(accessToken,bodyf);
    bodyf['parent_file_id'] = uploadInfof3['file_id'];
    bodyf['name'] = day;
    final uploadInfof4 = await createFile(accessToken,bodyf);
    return uploadInfof4;
  }


  //上传文件
  Future<http.Response> uploadFile(String url, File file) async {

    HttpClient httpClient = new HttpClient();
    HttpClientRequest requests = await httpClient.putUrl(Uri.parse(url));

    requests.add(file.readAsBytesSync());

    final response = await requests.close();
    print('Response status: ${response.statusCode}');
    await response.transform(utf8.decoder).forEach(print);
    httpClient.close();

    return http.Response(response.reasonPhrase, response.statusCode);
  }

  //完成上传
  Future<Map<String,dynamic>> complete(accessToken,drive_id,file_id,upload_id) async{
    final resp = await http.post(
        Uri.parse("$aliPanHost/adrive/v1.0/openFile/complete"),
        headers: {
          'Content-Type': 'application/json',
          'Authorization': 'Bearer $accessToken',
        },
        body: jsonEncode({
          'drive_id':drive_id,
          'file_id':file_id,
          'upload_id':upload_id
        })
    );
    Map<String, dynamic> json = jsonDecode(resp.body);
    return json;
  }

  //创建分享链接
  Future<Map<String,dynamic>> createShare(accessToken,drive_id,fileIdList,expiration,sharePwd) async{
    final resp = await http.post(
        Uri.parse("$aliPanHost/adrive/v1.0/openFile/createShare"),
        headers: {
          'Content-Type': 'application/json',
          'Authorization': 'Bearer $accessToken',
        },
        body: jsonEncode({
          'driveId':drive_id,
          'fileIdList':fileIdList,
          'expiration':expiration,
          'sharePwd':sharePwd
        })
    );
    Map<String, dynamic> json = jsonDecode(resp.body);
    return json;
  }

  //刷新access_token
  Future<Map<String,dynamic>> refreshToken(client_id,client_secret,refresh_token) async{
    final resp = await http.post(
        Uri.parse("$aliPanHost/oauth/access_token"),
        headers: {
          'Content-Type': 'application/json',
        },
        body: jsonEncode({
          'client_id':client_id,
          'grant_type':'refresh_token',
          'client_secret':client_secret,
          'refresh_token':refresh_token,
        })
    );
    Map<String, dynamic> json = jsonDecode(resp.body);
    return json;
  }

}

Flutter调用 Python 项目中的 API,通常是通过将 Python 项目部署为一个 Web 服务(如使用 Flask 或 FastAPI),然后让 Flutter 应用作为前端客户端,通过 HTTP 请求与该服务通信。 由于 Flutter 是运行在移动端或 Web 上的框架,它无法直接运行 Python 脚本,因此必须将 Python 项目暴露为 **HTTP 接口(RESTful API)**,Flutter 通过 `http` 包发起请求来获取数据。 --- ### ✅ 实现步骤概览: 1. **Python 后端:** 使用 Flask/FastAPI 搭建 API 服务 2. **部署服务:** 运行 Python 服务并监听某个端口(如 `localhost:5000` 或公网服务器) 3. **Flutter 前端:** 使用 `http` 包发送请求获取数据 4. **通信格式:** 通常使用 JSON 格式交互 --- ## 🔧 示例:使用 Flask + Flutter 实现 API 调用 ### 1. Python 后端(Flask) 安装 Flask: ```bash pip install flask ``` 创建 `app.py`: ```python from flask import Flask, jsonify, request app = Flask(__name__) # 示例接口:加法计算 @app.route('/api/add', methods=['POST']) def add(): data = request.get_json() a = data.get('a', 0) b = data.get('b', 0) result = a + b return jsonify({"result": result}) # 示例接口:获取消息 @app.route('/api/hello', methods=['GET']) def hello(): return jsonify({"message": "Hello from Python!"}) if __name__ == '__main__': app.run(host='0.0.0.0', port=5000, debug=True) ``` 启动服务: ```bash python app.py ``` 此时你的 API 地址是: - `http://127.0.0.1:5000/api/hello`(本地测试) - 若供手机访问,需使用局域网 IP 如 `http://192.168.x.x:5000` > ⚠️ 注意:手机连接电脑 Flask 服务时,需确保在同一网络,并运行 Flask 时使用 `host='0.0.0.0'`,允许外部访问。 --- ### 2. Flutter 客户端 #### 添加依赖 在 `pubspec.yaml` 中添加: ```yaml dependencies: http: ^0.16.0 # 最新版本请查 pub.dev flutter: sdk: flutter ``` 执行: ```bash flutter pub get ``` #### Dart 代码调用 API ```dart import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; import 'dart:convert'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar(title: Text("Flutter + Python API")), body: Center(child: PythonApiExample()), ), ); } } class PythonApiExample extends StatefulWidget { @override _PythonApiExampleState createState() => _PythonApiExampleState(); } class _PythonApiExampleState extends State<PythonApiExample> { String _message = "Press a button to call Python API"; final String baseUrl = 'http://192.168.1.100:5000'; // 修改为你的电脑局域网 IP Future<void> callHello() async { try { final response = await http.get(Uri.parse('$baseUrl/api/hello')); if (response.statusCode == 200) { final data = jsonDecode(response.body); setState(() { _message = data['message']; }); } else { setState(() { _message = 'Error: ${response.statusCode}'; }); } } catch (e) { setState(() { _message = 'Network Error: $e'; }); } } Future<void> callAdd() async { try { final response = await http.post( Uri.parse('$baseUrl/api/add'), headers: {'Content-Type': 'application/json'}, body: jsonEncode({'a': 10, 'b': 20}), ); if (response.statusCode == 200) { final data = jsonDecode(response.body); setState(() { _message = '10 + 20 = ${data['result']}'; }); } else { setState(() { _message = 'Error: ${response.statusCode}'; }); } } catch (e) { setState(() { _message = 'Network Error: $e'; }); } } @override Widget build(BuildContext context) { return Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Text(_message, style: TextStyle(fontSize: 18),), SizedBox(height: 20), ElevatedButton( onPressed: callHello, child: Text("Call GET /api/hello"), ), SizedBox(height: 10), ElevatedButton( onPressed: callAdd, child: Text("Call POST /api/add"), ), ], ); } } ``` --- ### 📌 关键点说明: | 点 | 说明 | |----|------| | `http.get()` / `http.post()` | 发起 HTTP 请求 | | `jsonEncode` / `jsonDecode` | 处理 JSON 数据 | | 局域网 IP (`192.168.x.x`) | 手机和电脑必须在同一 Wi-Fi 下才能访问 Flask 服务 | | Android 权限 | 在 `android/app/src/main/AndroidManifest.xml` 添加网络权限: ```xml <uses-permission android:name="android.permission.INTERNET" /> ``` --- ### ✅ 高级方案建议: - **生产环境:** 将 Python 服务部署到云服务器(如 AWS、Vercel Serverless、Railway、Render)或使用 Nginx + Gunicorn。 - **跨域问题:** 开发时可用 Flask-CORS 解决: ```python from flask_cors import CORS CORS(app) ``` - **使用 FastAPI 替代 Flask:** 更现代,支持异步,自动生成文档。 ```python from fastapi import FastAPI import uvicorn app = FastAPI() @app.get("/api/hello") def hello(): return {"message": "Hello from FastAPI"} ``` 启动:`uvicorn app:app --reload --host 0.0.0.0 --port 5000` --- ### ❗注意事项: - 不要使用 `localhost` 或 `127.0.0.1` 在手机上访问电脑服务 → 改用电脑的局域网 IP。 - 确保防火墙允许 5000 端口通信。 - 可先在浏览器中测试 `http://192.168.x.x:5000/api/hello` 是否能打开。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tutuxfsh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值