搜索插件、代码仓与 APP 分类

插件详情v0.1.0

annotated_shelf

功能强大的 Dart 库,用于使用注解生成 REST API。通过简单直观的接口,您可以轻松构建快速、高效且易于使用的 API。

macOSWindowsLinux
近 30 天下载
126
喜欢数
23
Pub 分数
140

安装插件

flutter pub add annotated_shelf

插件介绍

基于插件公开信息、社区数据与项目使用情况整理的选型参考。

Annotated_Shelf 是一个强大的 Dart 库,通过注解简化了 REST API 的创建。它提供了一种简洁直观的接口,可以直接通过代码注解定义路由、请求处理器和响应。基于 Shelf 框架构建,它使开发者能够以最少的样板代码生成高效且类型安全的 API。非常适合快速 API 开发,支持与 OpenAPI/Swagger 文档的无缝集成。该库可在 macOS、Windows 和 Linux 上运行,适用于跨平台后端服务。

适合场景

  • 使用最少的设置构建 RESTful API
  • 从代码生成 OpenAPI 文档
  • 后端服务的快速原型设计
  • 使用注解创建类型安全的端点
  • 与现有 Dart 项目集成

主要特点

  • 基于注解的路由定义
  • 基于货架构建,性能卓越
  • 自动 OpenAPI/Swagger 文档
  • 支持请求/响应建模
  • 跨平台兼容性

适合对象

  • Dart 开发人员构建后端 API
  • 需要快速 API 脚手架的团队
  • 需要 OpenAPI 集成的项目
  • 偏好声明式编码风格的开发者
  • 面向多个平台的后端服务

使用建议

  • 需要熟悉 Dart 注解
  • 受限于基于货架的服务器架构
  • 可能需要额外的配置才能实现复杂的路由
  • 最适合中小型 API
  • 文档生成依赖于注释的准确性

原始 README

以下为关联源码仓库的 README 原文快照,最新内容请访问源码仓库。

Annotated Shelf

Powerful, Lightweight, Fast development, Easy to learn

Documentation:

https://annotated-shelf.readthedocs.io/en/features-add_docs/index.html

Annotated Shelf is a powerful and lightweight Dart framework for generating REST APIs using annotations. Based on the popular Shelf library. Annotated Shelf provides a simple and intuitive interface for building APIs fast, efficiently, and easy to use without losing what Shelf can offer.

Features

  • Support for multiple HTTP methods and request types.
  • Support for File upload.
  • Automatic validation of request parameters.
  • Automatic Error responses based on exceptions.

Installation

To install Annotated Shelf, add it as a dependency in your pubspec.yaml file:

dependencies:
  annotated_shelf: ^0.1.0

Then, run pub get to install the package.

Getting Started

To use Annotated Shelf to create a REST API, import the library and annotate your models and controllers with the following annotations:

@RestAPI,
@GET,
@POST,
@PUT,
@DELETE,
@PATCH,

Annotated Shelf will automatically generate the necessary routes and endpoints based on the annotations you have provided.

Example

import 'package:annotated_shelf/annotated_shelf.dart';
import 'package:shelf/shelf.dart';
import 'package:shelf/shelf_io.dart' as io;

const _hostname = 'localhost';
const _port = 8080;
var itemsList = [Item("first item"), Item("second Item")];

class Item extends Payload {
  final String? name;

  Item(this.name);

  @override
  factory Item.fromJson(Map<String, dynamic> json) {
    return Item(json["name"]);
  }
  @override
  Map<String, dynamic> toJson() => {"name": name};
}

class TestForm extends Form {
  String name;
  int number;
  File image;

  TestForm(this.name, this.number, this.image);

  @override
  factory TestForm.fromJson(Map<String, dynamic> json) {
    return TestForm(
      json['name'] as String,
      json['number'] as int,
      File.fromJson(json['image'] as Map<String, dynamic>),
    );
  }

  @override
  Map<String, dynamic> toJson() => <String, dynamic>{
        'name': name,
        'number': number,
        'image': image,
      };
}

@RestAPI(baseUrl: '/to-do/list')
class ItemsAdaptor {
  @GET()
  List<Item> getAllItems(Request request) {
    return itemsList;
  }

  @GET(url: "/<itemName>")
  Item getItemByName(String itemName) {
    var index = itemsList.lastIndexWhere((element) => element.name == itemName);
    if (index >= 0) {
      return itemsList[index];
    } else {
      throw NotFoundError('item not found'); // this creates a 404 response
    }
  }

  @PUT(url: "/<itemName>")
  Item updateItem(Item item, String itemName) {
    var index = itemsList.lastIndexWhere((element) => element.name == itemName);
    if (index >= 0) {
      itemsList[index] = item;
      return getItemByName(item.name ?? '');
    } else {
      throw NotFoundError('item not found'); // this creates a 404 response
    }
  }

  @POST(url: "/")
  Response createNewItem(Item item) {
    var index =
        itemsList.lastIndexWhere((element) => element.name == item.name);
    if (index == -1) {
      itemsList.add(item);
      return Response(201); // pass a shelf response
    } else {
      throw BadRequestError('item with name in list');
    }
  }

  // examplo of uploading a file
  @POST(url: '/upload')
  Future<RestResponse> upload(TestForm form) async {
    print(form);
    return new RestResponse(201, {"msj": 'ok'}, "application/json");
  }
}

Future<void> main(List<String> args) async {
  var router = Cascade();

  router = await mount(ItemsAdaptor(), router);

  var server = await io.serve(router.handler, _hostname, _port);
  print('Serving at http://${server.address.host}:${server.port}');
}

/* 
-------------------------------------
mounting Instance of 'ItemsAdaptor'
adding get to-do/list
adding get to-do/list/<iteName>
adding put to-do/list/<iteName>
adding post to-do/list/
adding post to-do/list/upload
-------------------------------------
Serving at http://localhost:8080
*/

Contributing

We welcome contributions to Annotation Shelf! If you have an idea for a new feature or have found a bug, please open an issue on GitHub.

License

Annotation Shelf is released under the BSD-3-Clause. See LICENSE for details.

thanks

Special thanks to the Shelf project team for providing us with the opportunity to create servers using this beautiful language.

所属分类

依赖

依赖清单 3 项

源码仓库

使用此插件的项目

暂无相关数据。