前言

该系列前文提及到,要体现出资源的一个结构,那么如何体现出结构呢?比如说获取emproyee,应该写/api/companies/1/emproyees,这样可以体现其结构性。

那么这样改如何设置呢?

正文

[ApiController]
[Route("api/companies/{companyId}/employees")]
public class EmployeesController : ControllerBase
{
private readonly IMapper _mapper;
private readonly ICompanyRepository _companyRepository; public EmployeesController(IMapper mapper, ICompanyRepository companyRepository)
{
_mapper = mapper ?? throw new ArgumentNullException(nameof(mapper));
_companyRepository = companyRepository ?? throw new ArgumentNullException(nameof(companyRepository));
}
[HttpGet]
public async Task<ActionResult<IEnumerable<EmployeeDto>>>
GetEmployeesForCompany(Guid companyId,
[FromQuery] EmployeeDtoParameters parameters){
if (!await _companyRepository.CompanyExistsAsync(companyId))
{
return NotFound();
} var employees = await _companyRepository
.GetEmployeesAsync(companyId, parameters); var employeeDtos = _mapper.Map<IEnumerable<EmployeeDto>>(employees); return Ok(employeeDtos);
}
}

1.配置的路由为[Route("api/companies/{companyId}/employees")],这样companyId将会是一个变量,那么Guid companyId将会获取。

2.这里的逻辑是,employees 是从company的服务中中获取的,而不是单独的建立一个employees 服务。

3.同样值得注意的是获取得到是employees ,是一个集合,即使为空,这个集合也是存在的,所以不存在404这么一说,但是如果companyid 不存在那么这个就是404,因为可能不存在某个具体的公司。

这个时候如果返回404那么我们可以清晰的知道是公司不存在,而不是其他原因。

这个是获取一个集合的,那么获取某个单个员工呢。

和以前写的一样,如下:

[HttpGet("{employeeId}"]
public async Task<ActionResult<EmployeeDto>>
GetEmployeeForCompany(Guid companyId, Guid employeeId)
{
if (!await _companyRepository.CompanyExistsAsync(companyId))
{
return NotFound();
} var employee = await _companyRepository.GetEmployeeAsync(companyId, employeeId);
if (employee == null)
{
return NotFound();
} var employeeDto = _mapper.Map<EmployeeDto>(employee); return Ok(employeeDto);
}

唯一值得注意的就是404,可能是公司不存在,也可能是员工不存在,这里可以返回404的时候去写上一些具体原因,但是也不必如此。

因为无论是公司不存在还是员工不存在,都是这个员工没有找到,直接提示相应的错误即可。还有一个原因,一般来说这种链接是自动生成的get请求,所以如果不存在人工选择的问题,所以如果404,前端的处理方式就是员工不存在,而不用去知道是是否公司不存在。

RestfulApi 学习笔记——父子资源(四)的更多相关文章

  1. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第四章:Direct 3D初始化

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第四章:Direct 3D初始化 学习目标 对Direct 3D编程在 ...

  2. 【Unity Shaders】学习笔记——SurfaceShader(四)用纹理改善漫反射

    [Unity Shaders]学习笔记——SurfaceShader(四)用纹理改善漫反射 转载请注明出处:http://www.cnblogs.com/-867259206/p/5603368.ht ...

  3. python学习笔记--Django入门四 管理站点--二

    接上一节  python学习笔记--Django入门四 管理站点 设置字段可选 编辑Book模块在email字段上加上blank=True,指定email字段为可选,代码如下: class Autho ...

  4. VSTO学习笔记(十四)Excel数据透视表与PowerPivot

    原文:VSTO学习笔记(十四)Excel数据透视表与PowerPivot 近期公司内部在做一种通用查询报表,方便人力资源分析.统计数据.由于之前公司系统中有一个类似的查询使用Excel数据透视表完成的 ...

  5. Python学习笔记(十四)

    Python学习笔记(十四): Json and Pickle模块 shelve模块 1. Json and Pickle模块 之前我们学习过用eval内置方法可以将一个字符串转成python对象,不 ...

  6. python3.4学习笔记(二十四) Python pycharm window安装redis MySQL-python相关方法

    python3.4学习笔记(二十四) Python pycharm window安装redis MySQL-python相关方法window安装redis,下载Redis的压缩包https://git ...

  7. 《机器学习实战》学习笔记第十四章 —— 利用SVD简化数据

    相关博客: 吴恩达机器学习笔记(八) —— 降维与主成分分析法(PCA) <机器学习实战>学习笔记第十三章 —— 利用PCA来简化数据 奇异值分解(SVD)原理与在降维中的应用 机器学习( ...

  8. 【转】 Pro Android学习笔记(七四):HTTP服务(8):使用后台线程AsyncTask

    目录(?)[-] 5秒超时异常 AsyncTask 实现AsyncTask抽象类 对AsyncTask的调用 在哪里运行 其他重要method 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注 ...

  9. Android学习笔记(十四)——自定义广播

    //此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 我们除了可以通过广播接收器来接收系统广播, 还可以在应用程序中发送自定义的广播.下面我们来分别试一试发送自定义 ...

  10. Dynamic CRM 2013学习笔记(十四)复制/克隆记录

    经常有这样的需求,一个单据上有太多要填写的内容,有时还关联多个子单据,客户不想一个一个地填写,他们想从已有的单据上复制数据,克隆成一条新的记录.本文将介绍如何克隆一条记录,包括它的子单据以生成一条新的 ...

随机推荐

  1. Java 对象数组题目 + 改进(封装方法)

    1 /** 2 * 3 * @Description 4 * @author Bytezero·zhenglei! Email:420498246@qq.com 5 * @version 6 * @d ...

  2. 14 CodeTON Round 5 (Div. 1 + Div. 2, Rated, Prizes!)C. Tenzing and Balls(dp+前缀最大值优化)

    思路: dp还是挺明显的,思路可以参考最长上升子序列 有点dp的感觉 \(f[i]\)表示考虑前\(i\)个数,的最大值 当前数有两种删或不删 不删:\(f[i]=f[i-1]\); 删:\(f[i] ...

  3. WAF和IPS的区别

    简介 Web应用防火墙WAF(Web Application Firewall)和入侵防御系统IPS(Intrusion Prevention System)是网络安全领域中常见的两种安全解决方案,它 ...

  4. shell脚本中将 IFS (Internal Field Separator 内部字段分隔符)替换为换行符

    将 IFS 中的空白符(换行.制表符.空格)修改为仅包含换行 IFS 是shell中的内部变量,在使用 for var in var_list;do use $var do something don ...

  5. 如何在forEach内使用异步调用 async/await

    翻自: How to use async and await in a forEach JS loop? https://learn.coderslang.com/0144-how-to-use-as ...

  6. STM32 HAL 使用串口IDLE中断+DMA实现收发

    STM32 HAL 使用串口IDLE中断+DMA实现收发 cubeMX配置 mx配置如下(省去系统时钟,烧录口,工程属性配置) 注意:这里关闭 Force DMA channels Interrupt ...

  7. js原型详解

    js中的原型毫无疑问一个难点,学习如果不深入很容易就晕了! 任何一个js知识点,比如事件流,闭包,继承等,都有许许多多的说法,对于这些知识点我们都应该先熟练的使用,然后自己整理一套属于自己的理解说辞, ...

  8. 快速上手系列:JavaScript进阶

    一.基础 1.在firbug调试器的控制台输出内容. function(){ console.log() } 2.argument.没有形参也可表示传进来的参数,用数组表示,如argument[0], ...

  9. 一款超酷、功能强大的一体化网站测试工具:Web-Check

    今天给大家一款网站一体化测试工具:Web-Check! Web-Check 是一款功能强大的一体化工具,用于发现网站/主机的相关信息.用于检查网页的工具,用于确保网页的正确性和可访问性.它可以帮助开发 ...

  10. JSON格式化 动态生成表格 表格转置 行列转换 Excel导出 行求和 列求和

    不需要行求和.列求和的查看 JSON格式化 动态生成表格 表格转置 行列转换 Excel导出 接上篇,新增行求和.列求和 完整代码如下: <!DOCTYPE html PUBLIC " ...