• RestfulApi 学习笔记——.net core入门操作(二)


    前言

    前面简单介绍了一下restfulapi是什么东西,那么我们应该在.net core 中如何实现呢?或者说该怎么做才能有这个restful api呢?

    正文

    幸运的是.net core帮助我们实现了,restfulapi,但是不是强制性的,我们需要加上属性ApiController,表示符合restful api规则。

    这个也是非常常用的,那么ApiController有什么特性吗?

    1.要求使用属性路由(attribute routing)

    2.自动响应400。

    3.推断参数的绑定源

    4.multipart/form-data 请求推断

    5.错误状态的问题详细信息

    解释一下,第一个属性路由什么意思呢?

    [ApiController]
    [Route("api/Companies")]
    public class CompaniesController : ControllerBase
    

    就是使用了ApiController就一定要使用Route("api/Companies"),当然他可以放在方法上,也可以放在类上。

    这里我们看到有些是这样写的:[Route("api/[Controller]")] 表示使用当前的类Companies作为名字,但是一旦这个类名改变了,那么api 也变了,所以这个可以写死。

    第二个自动响应400,这个400是什么意思呢?是客户端传递的参数不正确,不符合后台规则,那么就会自动返回400,这个后面解释。

    第三个推断参数的绑定源,这个我们写过的都明白,不解释了。

    第四个是什么意思呢?第四个的意思是这样的。

    比如谁它自动推断参数的绑定源,但是去哪里获取呢?是去body 里面还是去form-data 里面,还是去url链接上,这都是值得思考的问题。

    那么使用这个ApiController,都是从multipart/form-data 中获取,其他的我们可以特殊表面,如下:

    第五个可以返回错误详情,这个是这样的,如果错误了会返回一条链接,打开这条链接可以查看到具体错误,这个后面章节会介绍到。

    这里给个例子:

    [Route("api/Companies")]
    [ApiController]
    public class CompaniesController : ControllerBase
    {
    
    	private readonly ICompanyRepository _companyRepository;
    
    	public CompaniesController(ICompanyRepository companyRepository)
    	{
    		_companyRepository = companyRepository ?? throw new ArgumentException(nameof(companyRepository));
    	}
    	[HttpGet]
    	public async Task<IActionResult> GetCompanies(CompanyDtoParameters parameters)
    	{
    		var companies = await _companyRepository.GetCompaniesAsync(parameters);
    		return new JsonResult(companies);
    	}
    
    	[HttpGet("{companyId}")]
    	public async Task<IActionResult> GetCompany(Guid companyId)
    	{
    		var company = await _companyRepository.GetCompanyAsync(companyId);
    		if (company == null)
    		{
    			return NotFound();
    		}
    		return Ok(company);
    	}
    }
    

    这里有人就奇怪了,不是说好不能写GetCompanies,然后我这里还写呢?

    是这样的,如果访问这个api呢,get 请求,访问的是getCompanies 这个方法,但是api是api/Companies。

    因为他是get请求,所以会请求到getCompanies,api/Companies 表示的是资源,而不是某个方法,这是要注意的地方。

    这里另外一个可能觉得奇怪的地方在于,你看 访问api/Companies 调用GetCompanies 返回为空,而api/Companies/1 调用GetCompany为空的时候返回的404,为啥区别待遇呢?

    因为别人在调用api/Companies的时候访问的这个资源为空,那么这个资源里面的东西为空,但是这个壳子还在。

    可以这么理解,company 是一张表,表里面是空的表还在,但是如果某条数据不在那么就是这个资源没有找到,看图:

    公司一是没有盒子的,也就是说没有容器,找不到就是没有。

    后续持续更新。

  • 相关阅读:
    [LintCode] 最长上升子序列
    [LintCode] 最长公共前缀
    [LintCode] A + B 问题
    [hihoCoder] 拓扑排序·一
    [LintCode] 拓扑排序
    [LintCode] 第k大元素
    [LintCode] 最小路径和
    [LeetCode] Factorial Trailing Zeros
    [LintCode] 尾部的零
    [LeetCode] Length of Last Word
  • 原文地址:https://www.cnblogs.com/aoximin/p/13912142.html
Copyright © 2020-2023  润新知