# zhmd-api
**Repository Path**: liubao68/zhmd-api
## Basic Information
- **Project Name**: zhmd-api
- **Description**: No description available
- **Primary Language**: Java
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2019-03-08
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 接口使用说明
## 对于接口实现者(provider)
* 依赖api对应的jar包
```
com.icss.newretail
delivery-center-api-endpoint
```
* 实现Service接口
```
@Service
public class DeliveryTaskServiceImpl implements DeliveryTaskService
```
## 对于接口使用者(consumer)
* 依赖service对应的jar包(只包含model和接口)
```
com.icss.newretail
delivery-center-api-service
```
* 采用RCP方式调用
```
@RpcReference(microserviceName = "delivery-center", schemaId = "deliveryTask")
private static DeliveryTaskService deliveryTaskService
```
# REST接口常见争议问题和处理
## 查询接口参数很复杂
比如:
```
public List queryGoodsByTags(String orgId, List tags)
```
当查询参数很复杂的时候,不建议采用query参数或者path参数。主要有如下原因:
* HTTP对于URL的长度有限制
* 复杂参数可能包含特殊字符,需要客户端在拼接URL的时候,进行URL转码,客户端开发者通常会遗漏。
* 对象无法和query参数进行合理的映射。
* query参数或者path参数会被proxy、web server等记录到日志里面,导致日志过大,或者造成敏感信息泄露。
对于复杂的查询操作,建议使用POST方法,相关复杂参数都封装为body。比如:
```
@PostMapping(path = "queryGoodsByTags")
public List queryGoodsByTags(@RequestParam(name = "orgId") String orgId, @RequestBody List tags)
```
一般的,通过query传递参数的场景,尽可能要保证参数个数少,参数类型为基础类型(字符串、数字等)。参数比较多的场景采用POST来传参。
本项目的处理原则是“尽可能遵循HTTP REST语义,但是不盲目,以系统可靠优先”。
对于DELETE请求,也有类似的情况。在设计GET和DELETE方法时,建议都不使用body参数,尽管HTTP协议并没有强制要求不能使用body,但是由于历史因素,很多WEB服务器支持上会有问题,接口设计应该尽可能避免不必要的麻烦和陷阱。只在POST、PUT、PATCH方法中使用body参数。
## REST接口的Path是否包含操作
比如:下面的接口定义path是否包含deleteGoodsUnitConvertor。
```
@DeleteMapping(path = "deleteGoodsUnitConvertor")
public ResponseBase deleteGoodsUnitConvertor(String goodsUnitConvertorId)
```
由于HTTP的方法POST/PUT/PATCH/GET/DELETE已经包含了增、改、查、删语义,path里面包含delete显得多余。不过由于项目的接口通常比较多,过多的思考接口语义反而增加了理解的难度。所以本项目path全部都包含了方法名字。包含名称有个好处,可以从URL中看出operation id,从而很简单的将URL和契约对应起来,方便查找。此外就是上面提到的原因,并不是所有的删除操作都一定对应于DELETE操作,出于系统可靠性、安全等方面考虑,可能使用POST/PATCH等代表查询或者删除操作。
## 多个对象参数
由于HTTP只能有一个body,所有多个对象参数需要包装为一个参数。 比如:
```
public ResponseBase inboundOrder(InboundOrder inboundOrder, Set inboundOrderItems)
```
封装为下面的REST接口定义:
```
@PostMapping(path = "inboundOrder")
public ResponseBase inboundOrder(@RequestBody InboundOrderRequest inboundOrderRequest) {
return stockService.inboundOrder(inboundOrderRequest.getInboundOrder(), inboundOrderRequest.getInboundOrderItems());
}
```
## 敏感信息不能采用query参数
Query参数可能被各种proxy、web server记录,因此对于用户敏感信息,不能使用query参数。 比如:
```
public ResponseBase rechargePrepaidCard(String cardId, double amount)
```
涉及到卡号和金额的数据,需要采用POST提交,参数存储在body。 虽然有些接口仅仅只是查询, 但也可能被设计为POST。 调整后的接口:
```
public ResponseBase rechargePrepaidCard(@RequestBody PrepaidAmountRequest prepaidAmountRequest)
```
# 项目介绍
* common-api
各个项目共有的Model类
* ai-center
* delivery-center 配送中心
配送中心主要提供商品配送相关的流程管理。比如生成配送单、领取配送单进行配送等。
* goods-center 商品中心
商品中心主要提供商品信息管理,包括录入商品、更新商品属性等。
* member-center 会员中心
会员中心主要提供会员的管理,包括增加会员、更新会员等级等。
* pay-center 支付中心
支付中心完成商品支付、结算、挂单、清单等功能。
* promotion-center 促销中心
促销中心完成促销信息录入,更新等功能。
* trade-center
交易中心管理交易流程,比如购物车、入库出库等。
* user-center 用户中心
用户中心管理系统用户的角色、权限、菜单等信息。