Files
JChargePointProtocol/docs/API接口参考/API接口参考.md
2025-10-28 14:39:06 +08:00

526 lines
17 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# API接口参考
<cite>
**本文档引用的文件**
- [SecurityConfiguration.java](file://jcpp-app/src/main/java/sanbing/jcpp/app/service/security/SecurityConfiguration.java)
- [BaseController.java](file://jcpp-app/src/main/java/sanbing/jcpp/app/adapter/controller/BaseController.java)
- [UserController.java](file://jcpp-app/src/main/java/sanbing/jcpp/app/adapter/controller/UserController.java)
- [StationController.java](file://jcpp-app/src/main/java/sanbing/jcpp/app/adapter/controller/StationController.java)
- [PileController.java](file://jcpp-app/src/main/java/sanbing/jcpp/app/adapter/controller/PileController.java)
- [GunController.java](file://jcpp-app/src/main/java/sanbing/jcpp/app/adapter/controller/GunController.java)
- [RpcController.java](file://jcpp-app/src/main/java/sanbing/jcpp/app/adapter/controller/RpcController.java)
- [ProtocolController.java](file://jcpp-app/src/main/java/sanbing/jcpp/app/adapter/controller/ProtocolController.java)
- [DownlinkController.java](file://jcpp-protocol-api/src/main/java/sanbing/jcpp/protocol/adapter/DownlinkController.java)
- [DownlinkGrpcService.java](file://jcpp-protocol-api/src/main/java/sanbing/jcpp/protocol/adapter/DownlinkGrpcService.java)
- [ApiResponse.java](file://jcpp-app/src/main/java/sanbing/jcpp/app/adapter/response/ApiResponse.java)
- [LoginResponse.java](file://jcpp-app/src/main/java/sanbing/jcpp/app/adapter/response/LoginResponse.java)
- [JCPPErrorCode.java](file://jcpp-app/src/main/java/sanbing/jcpp/app/exception/JCPPErrorCode.java)
- [JCPPErrorResponseHandler.java](file://jcpp-app/src/main/java/sanbing/jcpp/app/exception/JCPPErrorResponseHandler.java)
- [StationCreateRequest.java](file://jcpp-app/src/main/java/sanbing/jcpp/app/adapter/request/StationCreateRequest.java)
- [PileCreateRequest.java](file://jcpp-app/src/main/java/sanbing/jcpp/app/adapter/request/PileCreateRequest.java)
- [StartChargeDTO.java](file://jcpp-app/src/main/java/sanbing/jcpp/app/adapter/dto/StartChargeDTO.java)
- [StopChargeDTO.java](file://jcpp-app/src/main/java/sanbing/jcpp/app/adapter/dto/StopChargeDTO.java)
- [RpcRequest.java](file://jcpp-app/src/main/java/sanbing/jcpp/app/adapter/request/RpcRequest.java)
- [downlink.proto](file://jcpp-infrastructure-proto/src/main/proto/downlink.proto)
- [grpc.proto](file://jcpp-infrastructure-proto/src/main/proto/grpc.proto)
</cite>
## 目录
1. [简介](#简介)
2. [RESTful API](#restful-api)
1. [认证与安全](#认证与安全)
2. [设备管理接口](#设备管理接口)
3. [协议管理接口](#协议管理接口)
4. [RPC接口](#rpc接口)
3. [gRPC接口](#grpc接口)
4. [通用响应结构](#通用响应结构)
5. [错误码体系](#错误码体系)
6. [速率限制](#速率限制)
## 简介
本文档为JChargePointProtocol项目提供全面的API接口参考涵盖RESTful API和gRPC两种通信方式。系统为充电桩管理平台提供完整的设备管理、协议交互和远程控制能力。
**Section sources**
- [BaseController.java](file://jcpp-app/src/main/java/sanbing/jcpp/app/adapter/controller/BaseController.java)
## RESTful API
### 认证与安全
系统采用JWTJSON Web Token进行身份验证支持两种认证方式
1. **请求头认证**(推荐):
- `Authorization: Bearer <token>`
-`X-Authorization: <token>`
2. **查询参数认证**
- `?token=<token>`
认证端点:
- **POST /api/auth/login**用户登录获取JWT令牌
- **GET /api/user/info**:获取当前用户信息
成功登录后系统返回包含JWT令牌的响应后续请求需在请求头中携带该令牌。
```mermaid
sequenceDiagram
participant Client as "客户端"
participant AuthController as "认证控制器"
participant UserService as "用户服务"
Client->>AuthController : POST /api/auth/login
AuthController->>UserService : 验证用户凭证
UserService-->>AuthController : 验证结果
AuthController->>AuthController : 生成JWT令牌
AuthController-->>Client : 返回LoginResponse包含token
Client->>Client : 存储token用于后续请求
```
**Diagram sources**
- [SecurityConfiguration.java](file://jcpp-app/src/main/java/sanbing/jcpp/app/service/security/SecurityConfiguration.java#L40-L70)
- [LoginResponse.java](file://jcpp-app/src/main/java/sanbing/jcpp/app/adapter/response/LoginResponse.java)
### 设备管理接口
#### 充电站管理
提供对充电站的CRUD操作和查询功能。
| HTTP方法 | URL路径 | 描述 |
|--------|-----------------------|-------------------|
| GET | /api/stations | 分页查询充电站列表 |
| GET | /api/stations/{id} | 根据ID获取充电站详情 |
| POST | /api/stations | 创建新的充电站 |
| PUT | /api/stations/{id} | 更新充电站信息 |
| DELETE | /api/stations/{id} | 删除充电站 |
| GET | /api/stations/options | 获取充电站选项列表(用于下拉选择) |
| GET | /api/stations/search | 搜索充电站选项(支持关键字) |
**请求体 (POST /api/stations) - StationCreateRequest:**
```json
{
"stationName": "string, 充电站名称, 必填",
"stationCode": "string, 充电站编码, 必填",
"longitude": "number, 经度",
"latitude": "number, 纬度",
"province": "string, 省份",
"city": "string, 城市",
"county": "string, 区县",
"address": "string, 详细地址"
}
```
**响应体:**
```json
{
"success": true,
"message": "创建成功",
"data": {
"id": "uuid, 充电站ID",
"stationName": "string, 充电站名称",
"stationCode": "string, 充电站编码",
"longitude": "number, 经度",
"latitude": "number, 纬度",
"province": "string, 省份",
"city": "string, 城市",
"county": "string, 区县",
"address": "string, 详细地址",
"createdTime": "datetime, 创建时间"
},
"timestamp": "number, 时间戳"
}
```
**curl示例:**
```bash
curl -X POST "http://localhost:8080/api/stations" \
-H "Authorization: Bearer your-jwt-token" \
-H "Content-Type: application/json" \
-d '{
"stationName": "高新科技园充电站",
"stationCode": "ST001",
"longitude": 113.944,
"latitude": 22.543,
"province": "广东省",
"city": "深圳市",
"county": "南山区",
"address": "科技园南区1号"
}'
```
#### 充电桩管理
提供对充电桩的管理功能。
| HTTP方法 | URL路径 | 描述 |
|--------|------------------------------|-----------------|
| POST | /api/piles | 创建新的充电桩 |
| GET | /api/piles/{id} | 根据ID获取充电桩详情 |
| PUT | /api/piles/{id} | 更新充电桩信息 |
| DELETE | /api/piles/{id} | 删除充电桩 |
| GET | /api/piles | 分页查询充电桩列表(包含状态) |
| GET | /api/piles/options | 获取充电桩选项列表 |
| GET | /api/piles/status/{pileCode} | 根据桩编号获取充电桩状态 |
**curl示例:**
```bash
curl -X GET "http://localhost:8080/api/piles/status/P001" \
-H "Authorization: Bearer your-jwt-token"
```
#### 充电枪管理
提供对充电枪的管理功能。
| HTTP方法 | URL路径 | 描述 |
|--------|----------------------------|-----------------|
| POST | /api/guns | 创建新的充电枪 |
| GET | /api/guns/{id} | 根据ID获取充电枪详情 |
| PUT | /api/guns/{id} | 更新充电枪信息 |
| DELETE | /api/guns/{id} | 删除充电枪 |
| GET | /api/guns | 分页查询充电枪列表(包含状态) |
| GET | /api/guns/status/{gunCode} | 根据枪编号获取充电枪运行状态 |
| GET | /api/guns/code/{gunCode} | 根据充电枪编码获取详细信息 |
**curl示例:**
```bash
curl -X GET "http://localhost:8080/api/guns/code/G001" \
-H "Authorization: Bearer your-jwt-token"
```
**Section sources**
- [StationController.java](file://jcpp-app/src/main/java/sanbing/jcpp/app/adapter/controller/StationController.java)
- [PileController.java](file://jcpp-app/src/main/java/sanbing/jcpp/app/adapter/controller/PileController.java)
- [GunController.java](file://jcpp-app/src/main/java/sanbing/jcpp/app/adapter/controller/GunController.java)
- [StationCreateRequest.java](file://jcpp-app/src/main/java/sanbing/jcpp/app/adapter/request/StationCreateRequest.java)
### 协议管理接口
提供协议相关的查询功能。
| HTTP方法 | URL路径 | 描述 |
|--------|--------------------------|-------------|
| GET | /api/protocols/supported | 获取所有支持的协议列表 |
**响应体:**
```json
{
"success": true,
"message": "查询成功",
"data": [
{
"value": "string, 协议标识符",
"label": "string, 显示名称"
}
],
"timestamp": "number, 时间戳"
}
```
**curl示例:**
```bash
curl -X GET "http://localhost:8080/api/protocols/supported" \
-H "Authorization: Bearer your-jwt-token"
```
**Section sources**
- [ProtocolController.java](file://jcpp-app/src/main/java/sanbing/jcpp/app/adapter/controller/ProtocolController.java)
### RPC接口
提供通用化的充电桩远程过程调用接口,支持多种控制命令。
| HTTP方法 | URL路径 | 描述 |
|--------|------------------------|-------------------|
| POST | /api/rpc/oneway | 单向RPC调用不等待响应 |
| POST | /api/rpc/bidirectional | 双向RPC调用等待响应待实现 |
**请求体 - RpcRequest:**
```json
{
"method": "string, RPC方法名, 必填",
"parameter": "object, 方法参数, JSON格式, 必填",
"timeoutMs": "number, 超时时间毫秒仅用于双向RPC"
}
```
支持的`method`值:
- `startCharge`: 启动充电
- `stopCharge`: 停止充电
- `restartPile`: 重启充电桩
- `setPricing`: 设置计费策略
- `setQrcode`: 设置二维码
- `otaRequest`: OTA升级
- `offlineCardBalanceUpdate`: 离线卡余额更新
- `offlineCardSync`: 离线卡同步
- `offlineCardClear`: 离线卡清除
- `offlineCardQuery`: 离线卡查询
- `timeSync`: 时间同步
#### 启动充电
**method**: `startCharge`
**parameter结构 - StartChargeDTO:**
```json
{
"pileCode": "string, 充电桩编码, 必填",
"gunNo": "string, 充电枪编号, 必填",
"limitYuan": "number, 限制金额(元), 必填",
"orderNo": "string, 订单号, 必填",
"logicalCardNo": "string, 逻辑卡号",
"physicalCardNo": "string, 物理卡号",
"parallelNo": "string, 并充序号"
}
```
**curl示例:**
```bash
curl -X POST "http://localhost:8080/api/rpc/oneway" \
-H "Authorization: Bearer your-jwt-token" \
-H "Content-Type: application/json" \
-d '{
"method": "startCharge",
"parameter": {
"pileCode": "P001",
"gunNo": "G001",
"limitYuan": 100.00,
"orderNo": "ORD20240101001",
"logicalCardNo": "LC001",
"physicalCardNo": "PC001"
}
}'
```
#### 停止充电
**method**: `stopCharge`
**parameter结构 - StopChargeDTO:**
```json
{
"pileCode": "string, 充电桩编码, 必填",
"gunNo": "string, 充电枪编号, 必填"
}
```
**curl示例:**
```bash
curl -X POST "http://localhost:8080/api/rpc/oneway" \
-H "Authorization: Bearer your-jwt-token" \
-H "Content-Type: application/json" \
-d '{
"method": "stopCharge",
"parameter": {
"pileCode": "P001",
"gunNo": "G001"
}
}'
```
**Section sources**
- [RpcController.java](file://jcpp-app/src/main/java/sanbing/jcpp/app/adapter/controller/RpcController.java)
- [StartChargeDTO.java](file://jcpp-app/src/main/java/sanbing/jcpp/app/adapter/dto/StartChargeDTO.java)
- [StopChargeDTO.java](file://jcpp-app/src/main/java/sanbing/jcpp/app/adapter/dto/StopChargeDTO.java)
- [RpcRequest.java](file://jcpp-app/src/main/java/sanbing/jcpp/app/adapter/request/RpcRequest.java)
## gRPC接口
系统提供gRPC接口用于高效的双向通信主要服务于DownlinkGrpcService。
### 服务定义
`grpc.proto`文件中定义了`ProtocolInterface`服务:
```protobuf
service ProtocolInterface {
rpc onDownlink(stream RequestMsg) returns (stream ResponseMsg) {}
}
```
### 消息类型
#### RequestMsg
```protobuf
message RequestMsg {
int64 ts = 1;
TracerProto tracer = 2;
ConnectRequestMsg connectRequestMsg = 10;
DownlinkRequestMessage downlinkRequestMessage = 11;
}
```
#### ResponseMsg
```protobuf
message ResponseMsg {
TracerProto tracer = 2;
ConnectResponseMsg connectResponseMsg = 12;
DownlinkResponseMessage downlinkResponseMsg = 13;
}
```
### 连接流程
1. 客户端建立gRPC连接到服务器
2. 发送包含`ConnectRequestMsg``RequestMsg`
3. 服务器返回包含`ConnectResponseMsg``ResponseMsg`
4. 连接建立成功后,可发送`DownlinkRequestMessage`进行下行指令
### DownlinkRequestMessage
定义在`downlink.proto`中,包含各种充电桩控制指令。
### Java客户端调用示例
```java
// 创建gRPC通道
ManagedChannel channel = ManagedChannelBuilder
.forAddress("localhost", 6001)
.usePlaintext()
.build();
// 创建Stub
ProtocolInterfaceGrpc.ProtocolInterfaceStub stub =
ProtocolInterfaceGrpc.newStub(channel);
// 创建流观察者
StreamObserver<RequestMsg> requestObserver = stub.onDownlink(
new StreamObserver<ResponseMsg>() {
@Override
public void onNext(ResponseMsg response) {
// 处理服务器响应
System.out.println("收到响应: " + response);
}
@Override
public void onError(Throwable t) {
// 处理错误
System.err.println("gRPC错误: " + t.getMessage());
}
@Override
public void onCompleted() {
// 流完成
System.out.println("连接关闭");
}
}
);
// 发送连接请求
requestObserver.onNext(
RequestMsg.newBuilder()
.setConnectRequestMsg(
ConnectRequestMsg.newBuilder()
.setNodeId("client-001")
.build()
)
.build()
);
// 发送下行指令
UUID sessionId = UUID.randomUUID();
requestObserver.onNext(
RequestMsg.newBuilder()
.setDownlinkRequestMessage(
DownlinkRequestMessage.newBuilder()
.setSessionIdMSB(sessionId.getMostSignificantBits())
.setSessionIdLSB(sessionId.getLeastSignificantBits())
// 设置具体指令内容
.build()
)
.build()
);
```
**Diagram sources**
- [DownlinkGrpcService.java](file://jcpp-protocol-api/src/main/java/sanbing/jcpp/protocol/adapter/DownlinkGrpcService.java)
- [grpc.proto](file://jcpp-infrastructure-proto/src/main/proto/grpc.proto)
- [downlink.proto](file://jcpp-infrastructure-proto/src/main/proto/downlink.proto)
## 通用响应结构
所有RESTful API响应均采用统一的`ApiResponse`结构:
```json
{
"success": "boolean, 操作是否成功",
"errorCode": "string, 错误码(失败时存在)",
"message": "string, 响应消息",
"data": "object, 响应数据(成功时存在)",
"timestamp": "number, 时间戳"
}
```
**Section sources**
- [ApiResponse.java](file://jcpp-app/src/main/java/sanbing/jcpp/app/adapter/response/ApiResponse.java)
## 错误码体系
系统定义了统一的错误码体系`JCPPErrorCode`,用于标准化错误响应。
| 错误码 | HTTP状态码 | 描述 |
|-----|---------|---------|
| 2 | 500 | 通用错误 |
| 10 | 401 | 认证失败 |
| 11 | 401 | JWT令牌过期 |
| 15 | 401 | 凭证过期 |
| 20 | 403 | 权限拒绝 |
| 30 | 400 | 无效参数 |
| 31 | 400 | 请求参数错误 |
| 32 | 404 | 项目未找到 |
| 33 | 429 | 请求过多 |
| 34 | 429 | 更新过多 |
| 35 | 409 | 版本冲突 |
| 40 | 403 | 订阅违规 |
| 45 | 401 | 密码违规 |
| 46 | 500 | 数据库错误 |
错误响应示例:
```json
{
"success": false,
"errorCode": "AUTHENTICATION",
"message": "认证失败",
"timestamp": 1700000000000
}
```
**Section sources**
- [JCPPErrorCode.java](file://jcpp-app/src/main/java/sanbing/jcpp/app/exception/JCPPErrorCode.java)
- [JCPPErrorResponseHandler.java](file://jcpp-app/src/main/java/sanbing/jcpp/app/exception/JCPPErrorResponseHandler.java)
## 速率限制
系统实现了速率限制机制防止API被滥用。速率限制通过`@RateLimit`注解实现,配置在需要限制的接口上。
当请求超过限制时,系统返回`429 Too Many Requests`状态码,错误码为`TOO_MANY_REQUESTS`33
**Section sources**
- [RateLimit.java](file://jcpp-infrastructure-util/src/main/java/sanbing/jcpp/infrastructure/util/validation/RateLimit.java)