zoukankan      html  css  js  c++  java
  • .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

  • 相关阅读:
    有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不 死,问每个月的兔子总数为多少?
    Tomcat 全攻略
    MySQL 查询in操作,查询结果按in集合顺序显示
    乱码问题解决之道
    Java程序员面试中的多线程问题
    APACHE多个服务器的配置
    Python读写文件
    php字符串处理函数大全
    python 执行系统命令
    jquery-mobile
  • 原文地址:https://www.cnblogs.com/liuyang95/p/12952847.html
Copyright © 2011-2022 走看看