.net core RESTful Api笔记①
代码:https://github.com/346180990/RESTFul-API-.NET-CORE-Demo
准备工作:
WebApI和restful ApI介绍
能通过Http协议并通过网络调用的API,他是由Http协议,所需要的通过URI信息来指定端点。
Web ApI就是一个Web系统,通过访问URI可以进行信息交互。
URI:统一资源标识,他和URL属于被包含。
RESTful API:他是由Roy Fielding为REST风格的API制定一套约束或者风格。
创建项目:
program.cs
public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); }); }
因为是个web项目,所以需要个宿主CreateHostBuilder,这个方法里面有很多默认配置,之后使用build方法的run方法将web程序运行起来,startup是需要重点关注的。
starpup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
里面主要是这两个方法,他们会按照约定去调用,configureservices是负责依赖注入,
依赖注入(dependency injection)
ioc容器(inversion of control)
注册:需要交给ioc创建的类
请求实例:其他类可以请求实例
生命周期:是ioc容器控制的
生命周期分成三种:
Transient:注册的服务,每次请求都会生成新的实例
scoped:一次web请求生成一次,截止到web请求结束
singleton:第一次请求生成,直到服务器停止
configure里面写的是中间件
建立项目
项目结构:用户调用controller-->调用services-->调用data-->调用routine.db
services.AddDbContext<RoutineDBcontext>(option=> option.UseSqlite("data source=routine.db") );
在start里注册就会有db。
这里只记录controller
using Microsoft.AspNetCore.Mvc; using Rountine.API.Services; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace Rountine.API.Controllers { [ApiController] [Route("api/companies")] public class CompainesControllercs : ControllerBase { private readonly ICompanyRepository _companyRepository; public CompainesControllercs(ICompanyRepository companyRepository) { _companyRepository = companyRepository ?? throw new ArgumentException(nameof(companyRepository)); } [HttpGet] public async Task<IActionResult> GetCompanies() { var companies = await _companyRepository.GetCompaniesAsync(); return Ok(companies); } [HttpGet("{companyId}")] public async Task<IActionResult> GetCompanies(Guid companyId) { var company = await _companyRepository.GetCompanyAsync(companyId); if (company == null) { return NotFound(); } return Ok(company); } } }
ApiController指的是使用注解方式route是这个页面的路由加上对应的uri就能访问到需要的api(调用services)
修改lanuchsetting的启动地址为http://localhost:5000
之后运行起来使用postman调用
能够正常访问到api
HTTP方法记录
这里是那视频的例子记录的
post api/companies
post对应操作就是建立资源-->Company信息在body里面-->api/Company-->api.Company/{生成id}的内容(post请求会返回创建的资源,以及可以获取资源唯一标识uri)
get api/companies/{compayid}
单个资源:get对应动作就是获取资源-->不需要参数-->api/Companies/{companyId}(通过这种形式uri,标识公司资源的一个公司)-->api/companies/{companyId}的内容(get请求会返回路径对应的资源)
get api/companies?param1=xx¶m2=xx..
多个资源:get对应的动作就是获取资源-->自定义参数(get的参数是资源地址?后面的部分的,例如get api/companies?name=Nick)-->api/Companes-->api/companies/{companyId1}..api/companies/{companyIdn}的内容(get请求返回对应的资源)
delete api/companies/{companyId}
get-->delete会删除对应路径下的资源(没有参数)-->api/companies/{compamyId}(通过这种形式uri来表示公司的资源的一个公司)-->没有返回
patch api/companies/{companyId}(部分替换)
patch(patch表示对资源的局部更新)-->patch的参数在请求的body里-->api/companies/{companyId}-->没有返回
put api/companies/{companyId}(完全替换)
put(put会替换资源)-->公司的的信息(put的参数在body里)-->api/companies/{companId}(通过uri的表示公司资源的一个公司)-->api/companies/{companyId}(可选:如果资源不存在,就创建资源,这种情况下返回创建的资源,如果原来存在,就替换操作,无需返回)
HTTP状态码
1XX
属于信息状态码。web api并不适用1XX的状态码
2XX
意思就是成功了
200-OK表示请求成功了
201-create,表示成功的创建了资源
204-No content,请求成功但是不返回资源
3XX
用于跳转,例如需要告诉浏览器,某个页面网址已经永久的改变,绝大多数web api都不需要这种状态码
4XX
客户端错误
400-Bad request:表示api消费者发送到服务器的请求是有错误的;
401-Unauthorized,表示没有权限
403-forbidden,表示认正成功但是但是认证的用户却无法访问请求的资源;
404-not found,表示找不到资源
405-method not allowed 尝试发送请求时候使用了不被支持的http方法,就返回405
406-notacceptable,表示api消费者请求的表述格式不被webapi支持,并且api不会提供默认的表述格式
409-conflict:表示请求和服务器当前状态发生冲突,指的是资源冲突
415-UNsupported media type,有一些请求必须带上资源法到数据服务器。但是这些都是特定的媒体资源。
422-Unprocessable entity:他是http扩展协议,说明服务器已经动了实体的content type,通常表示语义上的错误,表示实体验证错误。
5XX
500-internal sever error:表示服务器的错误。
内容协商Content Negotiation
内容协商是这样的这对一个响应,有很多中表达方式,选用一个最佳的表述。
输出:accept header:
media Type(媒体类型)
application/json
application/xml
..
输出格式,asp.net core里面就是output formatters
输入:context-type header
application/json
application/xml
...
输入格式:asp.net core里面就是input formatters
用Accept请求的是xml但是服务器返回json需要在startup里面配置
services.AddControllers(setup=> { //返回的不是请求类型,报错 setup.ReturnHttpNotAcceptable = true; });
添加其他的格式
services.AddControllers(setup => { //返回的不是请求类型,报错 setup.ReturnHttpNotAcceptable = true; }).AddXmlDataContractSerializerFormatters();
AddXmlDataContractSerializerFormatters添加xml