Flutter网络请求插件utopia_http的使用

发布于 1周前 作者 caililin 来自 Flutter

Flutter网络请求插件utopia_http的使用

Utopia HTTP Server

Utopia HTTP是一个轻量级且快速的Dart HTTP库,用于构建优秀的Dart服务器端应用程序。它受到了Utopia PHP生态系统的启发。

Getting Started

首先,在在pubspec.yaml中添加依赖项:

dependencies:
  utopia_http: ^0.1.0

然后,在main.dart文件中进行如下操作:

import 'dart:io';
import 'package:utopia_http/utopia_http.dart';

void main() async {
  final address = InternetAddress.anyIPv4;
  final port = Http.getEnv('PORT', 8000);
  final app = Http(ShelfServer(address, port), threads: 8);

  app.get('/').inject('request').inject('response').action(
    (Request request, Response response) {
      response.text('Hello world');
      return response;
    },
  );

  await app.start();
}

Features

  • Parameters: 参数用于接收HTTP请求中的输入。参数可以是URL参数或以JSON结构的形式存在。

    定义一个带有参数的端点:

    app
      .get('/hello-world')
      .param('name', 'World', Text(255), 'Name to greet. Optional', true)
      .inject('response').action((String name, Response response) {
        response.text('Hello $name');
        return response;
      });
    

    使用curl命令测试:

    curl http://localhost:8000/hello-world
    curl http://localhost:8000/hello-world?name=Utopia
    curl http://localhost:8000/hello-world?name=Appwrite
    
  • Hooks: 钩子分为三种类型:

    • Init hooks:执行在路由动作执行之前
    • Shutdown hooks:执行在路由动作完成之后,但在应用关闭之前
    • Error hooks:执行在应用生命周期中的任何错误时

    提供多个钩子给每个阶段。如果没有为钩子分配组,则默认情况下该钩子将应用于所有路由。如果定义了组,则仅在属于同一组的请求期间运行。

    app
      .init()
      .inject('request')
      .action((Request request) {
        print('Received: ${request.method} ${request.url}');
      });
    
    app
      .shutdown()
      .inject('response')
      .action((Response response) {
        print('Responding with status code: ${response.status}');
      });
    
    app
      .error()
      .inject('error')
      .inject('response')
      .action((Exception error, Response response) {
        response.text(error.toString(), status: HttpStatus.internalServerError);
      });
    
  • Groups: 组允许您为多个端点定义共同行为。

    app
      .get('/login')
      .group(['api', 'public'])
      .inject('response')
      .action((Response response) {
        response.text('OK');
        return response;
      });
    
  • Resources: 资源允许您为请求准备依赖项,如数据库连接或发送请求的用户。为每个请求创建新的资源实例。

    app.resource('timestamp', () {
      return DateTime.now().millisecondsSinceEpoch;
    });
    
    app
      .get('/')
      .inject('timestamp')
      .inject('response')
      .action((int timestamp) {
        final diff = DateTime.now().millisecondsSinceEpoch - timestamp;
        print('Request took: $diff');
      });
    

示例代码

完整的示例代码如下:

import 'dart:io';
import 'package:utopia_http/utopia_http.dart';

void main() async {
  final address = InternetAddress.anyIPv4;
  final port = Http.getEnv('PORT', 8080);
  final app = Http(ShelfServer(address, port), threads: 8);

  app.get('/').inject('request').inject('response').action(
    (Request request, Response response) {
      response.text('Hello world');
      return response;
    },
  );
  app
    .get('/hello-world')
    .inject('request')
    .inject('response')
    .action((Request request, Response response) {
    response.text('Hello world');
    return response;
  });

  app
    .get('/users/:userId')
    .param(key: 'userId', defaultValue: '', description: 'Users unique ID')
    .inject('response')
    .action((String userId, Response response) {
    response.text(userId);
    return response;
  });

  app
    .get('/users/:userId/jhyap/:messing')
    .param(key: 'userId', defaultValue: '', description: 'Users unique ID')
    .param(key: 'messing', defaultValue: 'messing')
    .inject('response')
    .action((String userId, String messing, Response response) {
    response.text('tap tap');
    return response;
  });

  app
    .post('/users')
    .param(key: 'userId')
    .param(key: 'name')
    .param(key: 'email')
    .inject('response')
    .inject('request')
    .action((
    String userId,
    String name,
    String email,
    Response response,
    Request request,
  ) {
    response.json({
      'userId': userId,
      'name': name,
      'email': email,
    });
    return response;
  });

  app
    .get('/users/:userId/jhyap')
    .param(key: 'userId', defaultValue: '', description: 'Users unique ID')
    .inject('response')
    .action((String userId, Response response) {
    print(userId);
    response.text('Jhyap');
    return response;
  });

  await app.start();
  print("server started at http://${address.address}:${port}");
}

更多关于Flutter网络请求插件utopia_http的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter网络请求插件utopia_http的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用utopia_http插件进行网络请求的示例。这个插件通常用于简化HTTP请求,并提供了一些便捷的功能来处理请求和响应。

首先,你需要在你的pubspec.yaml文件中添加utopia_http依赖:

dependencies:
  flutter:
    sdk: flutter
  utopia_http: ^最新版本号  # 请替换为实际的最新版本号

然后运行flutter pub get来安装依赖。

接下来,你可以在你的Flutter项目中按照以下步骤使用utopia_http进行网络请求。

1. 导入utopia_http

在你的Dart文件中,导入utopia_http包:

import 'package:utopia_http/utopia_http.dart';

2. 配置HTTP客户端

你可以配置一个全局的HTTP客户端,或者根据需要创建局部的HTTP客户端。这里展示如何配置一个全局的HTTP客户端:

void main() {
  // 配置全局HTTP客户端
  UtopiaHttpClient.configure(
    baseURL: 'https://api.example.com', // 替换为你的API基础URL
    timeout: Duration(seconds: 30),     // 设置请求超时时间
    headers: {
      'Content-Type': 'application/json',
      'Authorization': 'Bearer your_token_here', // 替换为你的授权token
    },
  );

  runApp(MyApp());
}

3. 发送GET请求

Future<void> fetchData() async {
  try {
    // 发送GET请求
    Response response = await UtopiaHttpClient.get('/endpoint'); // 替换为你的API端点

    if (response.isOk) {
      // 处理成功的响应
      print('Data: ${response.data}');
    } else {
      // 处理失败的响应
      print('Error: ${response.message}');
    }
  } catch (e) {
    // 捕获并处理异常
    print('Exception: $e');
  }
}

4. 发送POST请求

Future<void> postData() async {
  try {
    // 准备请求体
    Map<String, dynamic> body = {
      'key1': 'value1',
      'key2': 'value2',
    };

    // 发送POST请求
    Response response = await UtopiaHttpClient.post('/endpoint', body: body); // 替换为你的API端点

    if (response.isOk) {
      // 处理成功的响应
      print('Data: ${response.data}');
    } else {
      // 处理失败的响应
      print('Error: ${response.message}');
    }
  } catch (e) {
    // 捕获并处理异常
    print('Exception: $e');
  }
}

5. 完整示例

下面是一个完整的Flutter应用示例,展示了如何在一个按钮点击事件中发送GET和POST请求:

import 'package:flutter/material.dart';
import 'package:utopia_http/utopia_http.dart';

void main() {
  UtopiaHttpClient.configure(
    baseURL: 'https://api.example.com',
    timeout: Duration(seconds: 30),
    headers: {
      'Content-Type': 'application/json',
      'Authorization': 'Bearer your_token_here',
    },
  );

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('UtopiaHttp Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              ElevatedButton(
                onPressed: fetchData,
                child: Text('Fetch Data (GET)'),
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: postData,
                child: Text('Post Data (POST)'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

Future<void> fetchData() async {
  try {
    Response response = await UtopiaHttpClient.get('/endpoint');
    if (response.isOk) {
      print('Data: ${response.data}');
      // 你可以在这里更新UI,例如使用setState
    } else {
      print('Error: ${response.message}');
    }
  } catch (e) {
    print('Exception: $e');
  }
}

Future<void> postData() async {
  try {
    Map<String, dynamic> body = {
      'key1': 'value1',
      'key2': 'value2',
    };
    Response response = await UtopiaHttpClient.post('/endpoint', body: body);
    if (response.isOk) {
      print('Data: ${response.data}');
      // 你可以在这里更新UI,例如使用setState
    } else {
      print('Error: ${response.message}');
    }
  } catch (e) {
    print('Exception: $e');
  }
}

这个示例展示了如何在Flutter项目中使用utopia_http插件发送GET和POST请求,并处理响应。根据你的实际需求,你可以进一步扩展这个示例。

回到顶部