记录一下学习B站杨旭课程(API)时一些之前不清楚的东西。
1.如果写一个类似意义的API时(查询某个公司下的某个员工)
那么RESTful的写法是:api/companies/{companyid}/employees/{employeeid}。
2.[ApiController]
·这个属性是应用于Controller的,他其实并不是强制的。
·会启用以下行为:
·要求使用属性路由(Attribute Routing),会导致endpointing失效。
·自动HTTP400响应。
·推断参数的绑定源。
·Multipart/form-data 请求推断。
·错误状态代码的问题详细信息。
3.PUT和PATCH
PATCH 用于更新部分资源(比如一个公司的几个字段)
PUT用于更新全部资源(比如一个公司的全部字段,除Id外)但是PUT也可以用来创建资源。
4.状态码。
201-请求成功并创建了资源
3xx-表示跳转
5.Http安全性和幂等性
6.创建一个资源后,可以用CreatedAtRoute(nameof(GetCompany),new{companyId = dto.Id}, dto);
此方法第一个参数为获取此资源的url,第二个参数为获取此资源的url的所需参数,第三个参数为当前返回的body。 此方法返回的状态码为201。
7.[FromRoute]和[FromQuery]
[fromquery] 请求查询字符串参数(用来推断其它的Action参数)
[fromroute] 当前请求中的路由数据(用来推断Action的参数名和路由模板中的参数名一致的情况)
感觉是不是fromquery用于搜索,条件查询。然后fromroute用于获取资源好一些。
8.ModelBinder
场景:根据多个id获取公司列表。
//控制器代码:
[HttpGet("{ids}")]
public async Task<IactionResult> GetCompanyCollection(
[FromRoute]
[ModelBinder(BinderType = typeof(ArrayModelBinder))
Ienumerable<Guid> ids]
)
//ModelBinder代码:
public Class ArrayModelBinder:ImodelBinder
public Task BindModelAsync(ModelBindingContext bindingContext)
{
bindingContext.Result = ModelBindingResult.Faild()
return Task.CompletedTask;
}
var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName).ToString();
if(string.IsNullOrWhiteSpace(value))
{
bindingContext.Result = ModelBindingResult.Success(null);
return Task.CompletedTask;
}
var elementType = bindingContext.ModelType.GetTypeInfo().GenericTypeArguments[0];
var converter = TypeDescriptor.GetConverter(elementType);
var values = value.split(new []{","}, StringSpilOptions.RemoveEmptyEntries.Select(x=>converter.ConvertFromString(x.Trim())).ToArray();
var typeValues = Array.CreateInstance(elementType,values.Length);
values.CopyTo(typedValues,0);
binding.Model = typeValues;
bindingContext.Result = ModelBingdingResult.Success(bindingContext.Model);
return Task.CompletedTask;
9.
10.当需要验证dto中多个属性间的关系时,可以实现IValidatableObject接口。(当特性的验证都通过后会进行他的验证)。
11.CustomAttribute进行验证
12.自定义报告错误信息
13.复杂验证信息可以使用FluentValidation。
14.HttpPut中未设置属性应该设置为默认值。
15.Guid的一个用途:可以在客户端指定ID用于创建资源。
16.分页中的size可以这样写:
17.后面的排序和数据塑形改天再学。