.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&param2=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

原文地址:https://www.cnblogs.com/liuyang95/p/12952847.html