以下几种HTTP API方式,每种方式都有其特点和优势:
- RESTful API
[ApiController]
[Route("api/[controller]")]
public class PeopleCountingController : ControllerBase
{
private readonly PeopleCountingService _service;
public PeopleCountingController(PeopleCountingService service)
{
_service = service;
}
// 获取汇总数据
[HttpGet("summary")]
public async Task<IActionResult> GetSummary()
{
var result = await _service.GetPeopleCountingDataAsync();
return Ok(result);
}
// 获取按摄像头分组的数据
[HttpGet("cameras")]
public async Task<IActionResult> GetCameraData()
{
var result = await _service.GetPeopleCountingDataByCameraAsync();
return Ok(result);
}
// 获取指定摄像头的数据
[HttpGet("cameras/{cameraName}")]
public async Task<IActionResult> GetSingleCameraData(string cameraName)
{
// 实现获取单个摄像头数据的逻辑
return Ok();
}
}
优势:
- 符合REST规范,易于理解和使用
- 支持标准的HTTP方法(GET/POST/PUT/DELETE)
- 良好的URL结构,便于API版本管理
- 适合移动端和Web端调用
- GraphQL API
public class PeopleCountingQuery : ObjectGraphType
{
public PeopleCountingQuery(PeopleCountingService service)
{
Field<PeopleCountingType>(
"peopleCount",
resolve: context => service.GetPeopleCountingDataAsync()
);
Field<ListGraphType<CameraDataType>>(
"cameras",
resolve: context => service.GetPeopleCountingDataByCameraAsync()
);
}
}
优势:
- 客户端可以精确指定需要的数据
- 减少网络传输,避免过度获取
- 支持复杂查询和数据关联
- 适合数据需求复杂的场景
- SignalR实时通信
public class PeopleCountingHub : Hub
{
private readonly PeopleCountingService _service;
private readonly ILogger<PeopleCountingHub> _logger;
public PeopleCountingHub(PeopleCountingService service, ILogger<PeopleCountingHub> logger)
{
_service = service;
_logger = logger;
}
public async Task SubscribeToUpdates()
{
try
{
var data = await _service.GetPeopleCountingDataByCameraAsync();
await Clients.Caller.SendAsync("ReceiveUpdate", data);
}
catch (Exception ex)
{
_logger.LogError(ex, "Error sending update");
}
}
}
优势:
- 支持双向实时通信
- 自动重连和心跳检测
- 支持分组和广播
- 适合需要实时更新的场景
- gRPC服务
syntax = "proto3";
service PeopleCountingService {
rpc GetPeopleCount (PeopleCountRequest) returns (PeopleCountResponse);
rpc GetCameraData (CameraDataRequest) returns (stream CameraDataResponse);
}
public class PeopleCountingGrpcService : PeopleCountingService.PeopleCountingServiceBase
{
private readonly PeopleCountingService _service;
public override async Task GetPeopleCount(
PeopleCountRequest request,
IServerStreamWriter<PeopleCountResponse> responseStream,
ServerCallContext context)
{
while (!context.CancellationToken.IsCancellationRequested)
{
var data = await _service.GetPeopleCountingDataAsync();
await responseStream.WriteAsync(new PeopleCountResponse { /* 填充数据 */ });
await Task.Delay(5000); // 5秒更新一次
}
}
}
优势:
- 高性能,低延迟
- 支持流式传输
- 强类型契约
- 适合微服务架构
- Minimal API
public static class PeopleCountingApi
{
public static void MapPeopleCountingEndpoints(this WebApplication app)
{
app.MapGet("/api/peoplecount", async (PeopleCountingService service) =>
{
return await service.GetPeopleCountingDataAsync();
})
.WithName("GetPeopleCount")
.WithOpenApi();
app.MapGet("/api/cameras", async (PeopleCountingService service) =>
{
return await service.GetPeopleCountingDataByCameraAsync();
})
.WithName("GetCameraData")
.WithOpenApi();
}
}
优势:
- 代码简洁,易于维护
- 启动速度快,资源占用少
- 适合小型API和微服务
- 支持OpenAPI(Swagger)
- WebSocket(已实现)
public class WebSocketHandler
{
public async Task HandleWebSocketAsync(WebSocket webSocket)
{
// 已实现的WebSocket处理逻辑
}
}
优势:
- 全双工通信
- 低开销的持久连接
- 实时数据推送
- 适合需要服务器推送的场景
建议的组合使用方案:
- 基础数据访问
- 使用RESTful API提供基本的数据访问接口
- 适合移动端APP和Web端的普通请求
- 实时数据更新
- 使用WebSocket或SignalR推送实时数据
- 适合电视大屏展示和实时监控
- 高性能场景
- 使用gRPC处理高并发、低延迟的数据传输
- 适合系统内部服务间通信
- 复杂查询需求
- 使用GraphQL处理灵活的数据查询需求
- 适合需要定制化数据的客户端
示例:组合使用多种API方式
public class Program
{
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
// 添加各种API支持
builder.Services.AddControllers(); // RESTful API
builder.Services.AddGraphQLServer(); // GraphQL
builder.Services.AddSignalR(); // SignalR
builder.Services.AddGrpc(); // gRPC
builder.Services.AddWebSockets(); // WebSocket
var app = builder.Build();
// 配置中间件
app.UseWebSockets();
app.MapControllers();
app.MapGraphQL();
app.MapGrpcService<PeopleCountingGrpcService>();
app.MapHub<PeopleCountingHub>("/peopleCountHub");
app.UseWebSocketServer();
app.Run();
}
}
这样的组合使用方案能够满足不同场景的需求:
- 普通数据查询使用RESTful API
- 实时数据更新使用WebSocket
- 复杂查询使用GraphQL
- 高性能场景使用gRPC
- 需要双向通信时使用SignalR
客户端可以根据具体需求选择合适的API方式进行集成。