public async Task <IActionResult> GetCompanies([FromQuery] CompanyDtoParameters parameters) { var companies = await _companyRepository.GetCompaniesAsync(parameters); var previousPageLink = companies.HasPrevious ? CreateCompaniesResourceUri(parameters, ResourceUriType.PreviousPage) : null; var nextPageLink = companies.HasNext ? CreateCompaniesResourceUri(parameters, ResourceUriType.NextPage) : null; var paginationMetadata = new { totalCount = companies.TotalCount, pageSize = companies.PageSize, currentPage = companies.CurrentPage, totalPages = companies.TotalPages, previousPageLink = previousPageLink, nextPageLink = nextPageLink }; Response.Headers.Add("X-Pagination", JsonSerializer.Serialize(paginationMetadata, new JsonSerializerOptions { Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping })); var companyDtos = _mapper.Map <IEnumerable <CompanyDto> >(companies); return(Ok(companyDtos.ShapeData(parameters.Fields))); }
/// <summary> /// 为 Companies 集合资源创建 HATEOAS 的 links(视频P42) /// </summary> /// <param name="parameters">CompanyDtoParameters</param> /// <param name="hasPrevious">是否有上一页</param> /// <param name="hasNext">是否有下一页</param> /// <returns>GetCompanies 集合资源的 links</returns> private IEnumerable <LinkDto> CreateLinksForCompany(CompanyDtoParameters parameters, bool hasPrevious, bool hasNext) { var links = new List <LinkDto>(); //CurrentPage 当前页链接 links.Add(new LinkDto(CreateCompaniesResourceUri(parameters, ResourceUriType.CurrentPage), "self", "GET")); if (hasPrevious) { //PreviousPage 上一页链接 links.Add(new LinkDto(CreateCompaniesResourceUri(parameters, ResourceUriType.PreviousPage), "previous_page", "GET")); } if (hasNext) { //NextPage 下一页链接 links.Add(new LinkDto(CreateCompaniesResourceUri(parameters, ResourceUriType.NextPage), "next_page", "GET")); } return(links); }
public async Task <PagedList <Company> > GetCompaniesAsync(CompanyDtoParameters companyDtoParameters) { if (companyDtoParameters == null) { throw new ArgumentNullException(nameof(companyDtoParameters)); } //if(string.IsNullOrWhiteSpace(companyDtoParameters.CompanyName)&&string.IsNullOrWhiteSpace(companyDtoParameters.SerchTerm)) //{ // return await _context.Companies.ToListAsync(); //} var queryExpress = _context.Companies as IQueryable <Company>; if (!string.IsNullOrWhiteSpace(companyDtoParameters.CompanyName)) { companyDtoParameters.CompanyName = companyDtoParameters.CompanyName.Trim(); queryExpress = queryExpress.Where(x => x.Name == companyDtoParameters.CompanyName); } if (!string.IsNullOrWhiteSpace(companyDtoParameters.SerchTerm)) { companyDtoParameters.SerchTerm = companyDtoParameters.SerchTerm.Trim(); queryExpress = queryExpress.Where(x => x.Name.Contains(companyDtoParameters.SerchTerm) || x.Introduction.Contains(companyDtoParameters.SerchTerm)); } //翻页逻辑在查询之后 // queryExpress = queryExpress.Skip(companyDtoParameters.PageSize * (companyDtoParameters.PageNumber - 1)).Take(companyDtoParameters.PageSize); //return await queryExpress.OrderBy(x => x.Name).ToListAsync(); //排序 var mappingDictionary = _propertyMappingService.GetPropertyMapping <CompanyDto, Company>(); queryExpress = queryExpress.ApplySort(companyDtoParameters.OrderBy, mappingDictionary); //利用自定义PagedList创建分页 return(await PagedList <Company> .Create(queryExpress, companyDtoParameters.PageNumber, companyDtoParameters.PageSize)); }
//用查询参数来模糊查询有关的公司,这里只根据Name和Introduction来查询,如果这两个字段包含查询参数就返回相应的公司数据 public async Task <IEnumerable <Company> > GetCompaniesAsync(CompanyDtoParameters parameters) { if (parameters == null) { throw new ArgumentNullException(nameof(parameters)); } //if (string.IsNullOrWhiteSpace(parameters.CompanyName) && string.IsNullOrWhiteSpace(parameters.SearchTerm)) //{ return await _context.Companies.ToListAsync(); } var queryExpression = _context.Companies as IQueryable <Company>; if (!string.IsNullOrWhiteSpace(parameters.CompanyName)) { parameters.CompanyName = parameters.CompanyName.Trim(); queryExpression = queryExpression.Where(x => x.Name == parameters.CompanyName); } if (!string.IsNullOrWhiteSpace(parameters.SearchTerm)) { parameters.SearchTerm = parameters.SearchTerm.Trim(); queryExpression = queryExpression.Where(x => x.Name.Contains(parameters.SearchTerm) || x.Introduction.Contains(parameters.SearchTerm)); } //flip over, 翻页 queryExpression = queryExpression.Skip(parameters.PageSize * (parameters.PageNumber - 1)) .Take(parameters.PageSize); //IQeryable延迟执行,到下面tolist才会执行查询语句到数据库 return(await queryExpression.ToListAsync()); }
public async Task <IActionResult> GetCompanies([FromQuery] CompanyDtoParameters parameters) { if (!_propertyMappingService.ValidMappingExistsFor <CompanyDto, Company>(parameters.OrderBy)) { return(BadRequest()); } if (!_propertyCheckerService.TypeHasProperties <CompanyDto>(parameters.Fields)) { return(BadRequest()); } var companies = await _companyRepository.GetCompaniesAsync(parameters); //var previousPageLink = companies.HasPrevious // ? CreateCompaniesResourceUri(parameters, ResourceUriType.PreviousPage) // : null; //var nextPageLink = companies.HasNext ? // CreateCompaniesResourceUri(parameters, ResourceUriType.NextPage) // : null; var paginationMetadata = new { totalCount = companies.TotalCount, pageSize = companies.PageSize, currentPage = companies.CurrentPage, totalPages = companies.TotalPages, //previousPageLink, //nextPageLink }; Response.Headers.Add("X-Pagination", JsonSerializer.Serialize(paginationMetadata, new JsonSerializerOptions { Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping })); var companyDtos = _mapper.Map <IEnumerable <CompanyDto> >(companies); var shapedData = companyDtos.ShapeData(parameters.Fields); var links = CreateLinksForCompany(parameters, companies.HasPrevious, companies.HasNext); var shapedCompaniesWithLinks = shapedData.Select(c => { var companyDict = c as IDictionary <string, object>; var companyLinks = CreateLinksForCompany((Guid)companyDict["Id"], null); companyDict.Add("links", companyLinks); return(companyDict); }); var linkedCollectionResource = new { value = shapedCompaniesWithLinks, links }; return(Ok(linkedCollectionResource)); }
[HttpHead] //支持head public async Task <IActionResult> GetCompanies([FromQuery] CompanyDtoParameters companyDtoParameters) { //验证http://localhost:5000/api/companies?orderBy=name参数 name是不符合的 if (!_mappingService.ValidMappingExistsFor <CompanyDto, Company>(companyDtoParameters.OrderBy)) { //http://localhost:5000/api/companies/5efc910b-2f45-43df-afae-620d40542822?fields=id,name 解决请求CompanyDto有无name属性 return(BadRequest()); } if (!_checkerService.TypeHasProperties <CompanyDto>(companyDtoParameters.Fields)) { return(BadRequest()); } //指定[FromQuery]可自动解析 //对异常处理 不可这样做 // throw new Exception("An Exception"); //get 请求数据所以需要Dto //ActionResult<List<CompanyDto>> 在此可以替代IActionResult var companiess = await _companyRepository.GetCompaniesAsync(companyDtoParameters); // var previousPageLink = companiess.HasPrevious ? CreateCompaniesResourceUri(companyDtoParameters, ResourceUriType.PreviousPage) : null; // var nextPageLink = companiess.HasNext ? CreateCompaniesResourceUri(companyDtoParameters, ResourceUriType.NextPage) : null; var paginationMetadata = new { totalCount = companiess.TotalCount, pageSize = companiess.PageSize, currentPage = companiess.CurrentPage, totalPages = companiess.TotalPages, // previousPageLink, // nextPageLink }; Response.Headers.Add("X-Pagination", System.Text.Json.JsonSerializer.Serialize(paginationMetadata, new JsonSerializerOptions { Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping })); var links = CreateLinksForCiampany(companyDtoParameters, companiess.HasPrevious, companiess.HasNext); var companiessdto = _mapper.Map <IEnumerable <CompanyDto> >(companiess); var shapeddata = companiessdto.ShapeData(companyDtoParameters.Fields); var shapedCompaniesWithLinks = shapeddata.Select(c => { var comoanydict = c as IDictionary <string, object>; var companylinks = CreateLinksForCiampany((Guid)comoanydict["Id"], null); comoanydict.Add("links", companylinks); return(comoanydict); }); var linksCollectionResource = new { value = shapedCompaniesWithLinks, links }; return(Ok(linksCollectionResource)); }
public async Task <IEnumerable <Company> > GetCompaniesAsync(CompanyDtoParameters parameters) { if (parameters == null) { throw new ArgumentNullException(nameof(parameters)); } if (string.IsNullOrWhiteSpace(parameters.CompanyName) && string.IsNullOrWhiteSpace(parameters.SearchTerm)) { return(await _context.Companies.ToListAsync()); } var queryExpresion = _context.Companies as IQueryable <Company>; if (!string.IsNullOrWhiteSpace(parameters.CompanyName)) { parameters.CompanyName = parameters.CompanyName.Trim(); queryExpresion = queryExpresion.Where(x => x.Name == parameters.CompanyName); } if (!string.IsNullOrWhiteSpace(parameters.SearchTerm)) { parameters.SearchTerm = parameters.SearchTerm.Trim(); queryExpresion = queryExpresion.Where(x => x.Name.Contains(parameters.SearchTerm) || x.Introduction.Contains(parameters.SearchTerm)); } return(await queryExpresion.ToListAsync()); }
public async Task <PagedList <Company> > GetCompaniesAsync(CompanyDtoParameters parameters) { if (parameters == null) { throw new ArgumentNullException(nameof(parameters)); } //if (string.IsNullOrWhiteSpace(parameters.SearchTerm) && // string.IsNullOrWhiteSpace(parameters.CompanyName)) //{ // return await _context.Companies.ToListAsync(); //} var queryExpression = _context.Companies as IQueryable <Company>; if (!string.IsNullOrWhiteSpace(parameters.CompanyName)) { parameters.CompanyName = parameters.CompanyName.Trim(); queryExpression = queryExpression.Where(x => x.Name == parameters.CompanyName); } if (!string.IsNullOrWhiteSpace(parameters.SearchTerm)) { parameters.SearchTerm = parameters.SearchTerm.Trim(); queryExpression = queryExpression.Where(x => x.Name.Contains(parameters.SearchTerm) || x.Introduction.Contains(parameters.SearchTerm)); } //queryExpression = queryExpression.Skip(parameters.PageSize * (parameters.PageNumber - 1)) // .Take(parameters.PageSize); //return await queryExpression.ToListAsync(); return(await PagedList <Company> .CreateAsync(queryExpression, parameters.PageNumber, parameters.PageSize)); }
public async Task <IEnumerable <Company> > GetCompaniesAsync(CompanyDtoParameters parameters) { // 如果参数类为空,则直接抛出空指针错误 if (parameters == null) { throw new ArgumentNullException(nameof(parameters)); } // 如果没有传入参数,表示返回整个序列 if (string.IsNullOrWhiteSpace(parameters.CompanyName) && string.IsNullOrWhiteSpace(parameters.SearchTerm)) { return(await _context.Companies.ToListAsync()); } // 有参数,表示需要筛选或查询结果 var items = _context.Companies as IQueryable <Company>; if (!string.IsNullOrWhiteSpace(parameters.CompanyName)) { // 筛选使用的是全相等 parameters.CompanyName = parameters.CompanyName.Trim(); items = items.Where(x => x.Name == parameters.CompanyName); } if (!string.IsNullOrWhiteSpace(parameters.SearchTerm)) { // 查询使用的是包含关系 parameters.SearchTerm = parameters.SearchTerm.Trim(); items = items.Where(x => x.Name.Contains(parameters.SearchTerm) || x.Introduction.Contains(parameters.SearchTerm)); } return(await items.OrderBy(x => x.Id).ToListAsync()); }
public async Task <IActionResult> GetCompanies([FromQuery] CompanyDtoParameters parameters) { if (!_propertyMappingService.ValidMappingExistsFor <CompanyDto, Company>(parameters.OrderBy)) { return(BadRequest()); } if (!_propertyCheckerService.TypeHasProperties <CompanyDto>(parameters.Fields)) { return(BadRequest()); } var companies = await _companyRepository.GetCompaniesAsync(parameters); var paginationMetadata = new { totalCount = companies.TotalCount, pageSize = companies.PageSize, currentPage = companies.CurrentPage, totalPages = companies.TotalPages }; Response.Headers.Add("X-Pagination", JsonSerializer.Serialize(paginationMetadata, new JsonSerializerOptions { Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping })); var companyDtos = _mapper.Map <IEnumerable <CompanyDto> >(companies); var shapedData = companyDtos.ShapeData(parameters.Fields); return(Ok(shapedData)); }
private IEnumerable <LinkDto> CreateLinksForCompany(CompanyDtoParameters parameters, bool hasPrevious, bool hasNext) { List <LinkDto> links = new List <LinkDto> { new LinkDto(CreateCompaniesResourceUri(parameters, ResourceUriType.CurrentPage), "self", "Get") }; if (hasPrevious) { links.Add(new LinkDto(CreateCompaniesResourceUri(parameters, ResourceUriType.PreviousPage), "previous_page", "Get")); } if (hasNext) { links.Add(new LinkDto(CreateCompaniesResourceUri(parameters, ResourceUriType.PreviousPage), "next_page", "Get")); } return(links); }
public async Task <PagedList <Company> > GetCompaniesAsync(CompanyDtoParameters parameters) { if (parameters == null) { throw new ArgumentNullException(nameof(parameters)); } var queryExpression = _context.Companies as IQueryable <Company>; if (!string.IsNullOrWhiteSpace(parameters.CompanyName)) { parameters.CompanyName = parameters.CompanyName.Trim(); queryExpression = queryExpression.Where(x => x.Name == parameters.CompanyName); } if (!string.IsNullOrWhiteSpace(parameters.SearchTerm)) { parameters.CompanyName = parameters.SearchTerm.Trim(); queryExpression = queryExpression.Where(x => x.Name.Contains(parameters.SearchTerm) || x.Introduction.Contains(parameters.SearchTerm)); } //queryExpression = queryExpression.Skip(parameters.PageSize * (parameters.PageNumber - 1)) // .Take(parameters.PageSize); var mappingDictionary = _propertyMappingService.GetPropertyMapping <CompanyDto, Company>(); queryExpression = queryExpression.ApplySort(parameters.OrderBy, mappingDictionary); return(await PagedList <Company> .CreateAsync(queryExpression, parameters.PageNumber, parameters.PageSize)); }
[HttpHead] //让该方法支持 Head 请求,可能用于查看Api的此功能是否可以正常使用,执行后不返回具体数据,只返回状态码,但里面的代码是跟get一样执行的,注意这个 Head 请求的写法只能写在Get操作的方法上 public async Task <IActionResult> GetCompanies( //使用 ActionResult<T>注明返回类型,有利于自动文档的建立; 但是加了塑形后返回的是可选字段的<T> ,不能指定是什么类型,所以用回IActionResult [FromQuery] CompanyDtoParameters parameters) //现在的parameters参数属于复杂参数,netcore默认这个是[FromBody]的,但如果现在用http://localhost:5000/api/companies/?CompanyName=Microsoft&SearchTerm=i这样的Uril去访问这个资源的话,将会出现415的错误码,因为这个Uril用的是[FromQuery]方式接收参数,与请求中的参数来源不一致导致的,所以这里的参数前要加上[FromQuery]就说明参数的来源. { if (!_propertyMappingService.VaildMappingExistsFor <CompanyDto, Company>(parameters.OrderBy)) { return(BadRequest()); } var companies = await _companyRepository.GetCompaniesAsync(parameters); var previousPageLink = companies.HasPrevious ? CreateCompanyesResourceUri(parameters, ResourceUriType.PreviousPage) : null; var nextPageLink = companies.HasNext ? CreateCompanyesResourceUri(parameters, ResourceUriType.NextPage) : null; var paginationMatadata = new { totalCount = companies.TotalCount, pageSize = companies.PageSize, currentPage = companies.CurrentPage, totalPages = companies.TotalPages, previousPageLink, nextPageLink }; Response.Headers.Add("X-Pagination", JsonSerializer.Serialize(paginationMatadata, //加入这个参数,把生成的Link中把不安全的字符比如“\”自动转化安全的功能去掉,也就是生成象"http://abc.com/abc"这种 new JsonSerializerOptions { Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping })); var companyDtos = _mapper.Map <IEnumerable <CompanyDto> >(companies); return(Ok(companyDtos.ShapeData(parameters.Fields))); }
private string CreateCompaniesResourceUri(CompanyDtoParameters parameters, ResourceUriType type) { switch (type) { case ResourceUriType.PreviousPage: return(Url.Link(nameof(GetCompanies), new { pageNumber = parameters.PageIndex - 1, pageSize = parameters.PageSize, companyName = parameters.CompanyName, searchTerm = parameters.SearchTerm })); case ResourceUriType.NextPage: return(Url.Link(nameof(GetCompanies), new { pageNumber = parameters.PageIndex + 1, pageSize = parameters.PageSize, companyName = parameters.CompanyName, searchTerm = parameters.SearchTerm })); default: return(Url.Link(nameof(GetCompanies), new { pageNumber = parameters.PageIndex, pageSize = parameters.PageSize, companyName = parameters.CompanyName, searchTerm = parameters.SearchTerm })); } }
private IEnumerable <LinkDto> createLinksForCompany(CompanyDtoParameters parameters) { var links = new List <LinkDto>(); links.Add(new LinkDto(CreateCompaniesResourceUri(parameters, ResourceUriType.Currentpage), "self", "GET")); return(links); }
// 1、默认情况会生成Task<IActionResult>的返回类型,这是一个泛型,最好将返回类型确定,这样可以帮助更好的阅读代码 // 2、默认使用HttpGet方法,并且直接使用class的Route,.net core会对参数进行自动推断,以确定使用什么样的方式获取参数([FromBody] / [FromQuery] / ...) // 这里使用一个参数q,通常是一个查询参数,将参数传入,根据是否为空,进行不同数据结果的返回。 // 3、使用mapper(AutoMapper)类,可以映射数据库模型和用户使用模型之间的关系,具体实现在Profiles中,同时注册了服务,即可使用。 //public async Task<ActionResult<IEnumerable<CompanyDto>>> GetCompanies(string q) //{ // var companies = await companyRepository.GetCompaniesAsync(q); // var companyDtos = mapper.Map<IEnumerable<CompanyDto>>(companies); // return Ok(companyDtos); //} // 更新参数的使用,使用一个参数类来传参。同时,因为这里传入的是一个复杂的类,和上面的单独传入的q有区别,系统会默认认为这应该是从[FromBody]传入的, // 会导致查询条件出错并且body中找不到相应参数。这时,需要显式的给出[FromQuery]告诉系统这时一个查询参数即可。 public async Task <ActionResult <IEnumerable <CompanyDto> > > GetCompanies([FromQuery] CompanyDtoParameters companyDtoParameters) { var companies = await companyRepository.GetCompaniesAsync(companyDtoParameters); var companyDtos = mapper.Map <IEnumerable <CompanyDto> >(companies); return(Ok(companyDtos)); }
[HttpHead] //添加对 Http Head 的支持,Head 请求只会返回 Header 信息,没有 Body(视频P16) public async Task <IActionResult> GetCompanies([FromQuery] CompanyDtoParameters parameters) { //判断Uri query 字符串中的 orderby 是否合法(视频P38) if (!_propertyMappingService.ValidMappingExistsFor <CompanyDto, Company>(parameters.OrderBy)) { return(BadRequest()); //返回状态码400 } //判断Uri query 字符串中的 fields 是否合法(视频P39) if (!_propertyCheckerService.TypeHasProperties <CompanyDto>(parameters.Fields)) { return(BadRequest()); //返回状态码400 } //GetCompaniesAsync(parameters) 返回的是经过翻页处理的 PagedList<T>(视频P35) var companies = await _companyRepository.GetCompaniesAsync(parameters); //向 Header 中添加翻页信息(视频P35) //上一页的 URI var previousPageLink = companies.HasPrevious ? CreateCompaniesResourceUri(parameters, ResourceUnType.PreviousPage) : null; //下一页的 URI var nextPageLink = companies.HasNext ? CreateCompaniesResourceUri(parameters, ResourceUnType.NextPage) : null; var paginationMetdata = new { totalCount = companies.TotalCount, pageSize = companies.PageSize, currentPage = companies.CurrentPage, totalPages = companies.TotalPages, previousPageLink, nextPageLink }; Response.Headers.Add("X-Pagination", JsonSerializer.Serialize(paginationMetdata, new JsonSerializerOptions //URI 中的‘&’、‘?’符号不应该被转义,因此改用不安全的 Encoder { Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping })); //不使用 AutoMapper //var companyDtos = new List<CompanyDto>(); //foreach(var company in companies) //{ // companyDtos.Add(new CompanyDto // { // Id = company.Id, // Name = company.Name // }); //} // //使用 AutoMapper(视频P12) var companyDtos = _mapper.Map <IEnumerable <CompanyDto> >(companies); return(Ok(companyDtos.ShapeData(parameters.Fields))); //OK() 返回状态码200 }
private string CreateCompaniesResourceUri(CompanyDtoParameters parameters, ResourceUriType type) { switch (type) { case ResourceUriType.PreviousPage: return(Url.Link( nameof(GetCompanies), new { fields = parameters.Fields, orderBy = parameters.OrderBy, pageNumber = parameters.PageNumber - 1, pageSize = parameters.PageSize, companyName = parameters.CompanyName, searchTerm = parameters.SearchTerm })); case ResourceUriType.NextPage: return(Url.Link( nameof(GetCompanies), new { fields = parameters.Fields, orderBy = parameters.OrderBy, pageNumber = parameters.PageNumber + 1, pageSize = parameters.PageSize, companyName = parameters.CompanyName, searchTerm = parameters.SearchTerm })); case ResourceUriType.CurrentPage: return(Url.Link( nameof(GetCompanies), new { fields = parameters.Fields, orderBy = parameters.OrderBy, pageNumber = parameters.PageNumber, pageSize = parameters.PageSize, companyName = parameters.CompanyName, searchTerm = parameters.SearchTerm })); default: return(Url.Link( nameof(GetCompanies), new { fields = parameters.Fields, orderBy = parameters.OrderBy, pageNumber = parameters.PageNumber, pageSize = parameters.PageSize, companyName = parameters.CompanyName, searchTerm = parameters.SearchTerm })); } }
//public async Task<IActionResult> GetCompanies() 與下方相同但下方更明確 public async Task <ActionResult <IEnumerable <CompanyDto> > > GetCompanies([FromQuery] CompanyDtoParameters parameters) { var companies = await _companyRepository.GetCompaniesAsync(parameters); // 目標:IEnumerable<CompanyDto>來源companies var companyDtos = _mapper.Map <IEnumerable <CompanyDto> >(companies); return(Ok(companyDtos)); //OK() 返回200 }
public async void OnLoaded() { enterpriseApi = Container.Resolve <IEnterpriseApi>(); CompanyCards = new ObservableCollection <Card>(); companyParameters = new CompanyDtoParameters(); await Task.Run(() => GetCompanies()); }
//FromQuery是重点,正常如果不指定fromquery就会报错 public async Task <IActionResult> GetCompanies([FromQuery] CompanyDtoParameters parameters) { if (!_propertyMappingService.ValidMappingExistFor <CompanyDto, Company>(parameters.OrderBy) || !_propertyCheckerService.TypeHasProperties <CompanyDto>(parameters.Fields)) { return(BadRequest()); } var companies = await _companyRepository.GetCompaniesAsync(parameters); //var previousPageLink = companies.HasPrevious ? // CreateCompaniesResourceUri(parameters, ResourceUriType.PreviousPage) // : null; //var nextPageLink = companies.HasNext ? // CreateCompaniesResourceUri(parameters, ResourceUriType.NextPage) // : null; var oaginationMetadata = new { totalCount = companies.TotalCount, totalPages = companies.TotalPages, pageSize = companies.PageSize, currentPage = companies.CurrentPage, //previousPageLink, //nextPageLink }; //自定义header 返回分页数据, 因为如果在OK体内返回其他信息不符合Restful api的设计原则. //方法是GetCompanies,应该只返回companies的数据,而不应该包含其他额外数据,额外数据应该通过自定义header返回. Response.Headers.Add("X-Pagination", System.Text.Json.JsonSerializer.Serialize(oaginationMetadata, new System.Text.Json.JsonSerializerOptions { //http web 默认会将一些字符转义,保护url,添加此属性不会将&符号转义. Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping })); var companyDtos = _mapper.Map <IEnumerable <CompanyDto> >(companies); var shapedData = companyDtos.ShapeData(parameters.Fields); var links = CreateLinksForCompany(parameters, companies.HasPrevious, companies.HasNext); var shapedCompaniesWithLinks = shapedData.Select(a => { var companyDic = a as IDictionary <string, object>; var companyLinks = CreateLinksForCompany((Guid)companyDic["Id"], null); companyDic.Add("links", companyLinks); return(companyDic); }); var linkedCollectionResource = new { value = shapedCompaniesWithLinks, links }; return(Ok(linkedCollectionResource)); }
[HttpHead] //一个方法可以同时支持Get与Head,相同的是,方法都会正常执行;不同的是,HttpHead不用传输body内容。 public async Task <ActionResult <IEnumerable <CompanyDto> > > GetCompanies( [FromQuery] CompanyDtoParameters parameters //复杂类型,默认从body绑定,因此需要手动指定从query绑定,否则415错误 ) { var companies = await _repository.GetCompaniesAsync(parameters); var companyDtos = _mapper.Map <IEnumerable <CompanyDto> >(companies); return(Ok(companyDtos)); }
/// <summary> /// Gets the companies asynchronous. /// </summary> /// <param name="parameters">The parameters.</param> /// <returns></returns> public async Task <PagedList <Company> > GetCompaniesAsync(CompanyDtoParameters parameters) { Guards.ThrowIfNull(parameters); var pagedCompanies = await PagedList <Company> .CreateAsync( companyRepository.Select, parameters.PageNumber, parameters.PageSize); return(pagedCompanies); }
public async Task <IActionResult> GetCompanies([FromQuery] CompanyDtoParameters parameters) { var companies = await _companyRepository.GetCompaniesAsync(parameters); var companyDtos = _mapper.Map <IEnumerable <CompanyDto> >(companies); //var companyDtos = new List<CompanyDto>(); //foreach (var company in companies) //{ // companyDtos.Add(new CompanyDto { Id = company.Id, Name = company.Name }); //} return(Ok(companyDtos)); }
/// <summary> /// 生成上一页或下一页的 URI(P35) /// </summary> /// <param name="parameters"></param> /// <param name="type"></param> /// <returns></returns> private string CreateCompaniesResourceUri(CompanyDtoParameters parameters, ResourceUriType type) { switch (type) { case ResourceUriType.PreviousPage: //上一页 return(Url.Link( //API 名 nameof(GetCompanies), //Uri Query 字符串参数 匿名类 new { pageNumber = parameters.PageNumber - 1, pageSize = parameters.PageSize, companyName = parameters.CompanyName, searchTerm = parameters.SearchTerm, orderBy = parameters.OrderBy, //排序(P38) fields = parameters.Fields //数据塑形(P39) })); ; case ResourceUriType.NextPage: //下一页 return(Url.Link( nameof(GetCompanies), new { pageNumber = parameters.PageNumber + 1, pageSize = parameters.PageSize, companyName = parameters.CompanyName, searchTerm = parameters.SearchTerm, orderBy = parameters.OrderBy, fields = parameters.Fields })); default: //当前页 return(Url.Link( nameof(GetCompanies), new { pageNumber = parameters.PageNumber, pageSize = parameters.PageSize, companyName = parameters.CompanyName, searchTerm = parameters.SearchTerm, orderBy = parameters.OrderBy, fields = parameters.Fields })); } }
//public async Task<IActionResult> GetCompanies() //既可以使用上面的这个方式,也可以使用下面的这个——下面的是使用ActionResult<T>、其中T是IEnumerable<CompanyDto>类型 public async Task <ActionResult <IEnumerable <CompanyDto> > > GetCompanies([FromQuery] CompanyDtoParameters parameters) { var companies = await _companyRepository.GetCompaniesAsync(parameters); //生成前一页标签 var previousPageLike = companies.HasPrevious ? CreateCompaniesResourceUri(parameters, ResourceUriType.PreviousPage) : null; //生成后一页标签 var nextPageLinke = companies.HasNext ? CreateCompaniesResourceUri(parameters, ResourceUriType.NextPage) : null; var pagenationMetadata = new { totalCount = companies.TotalCount, pageSize = companies.PageSize, currentPage = companies.CurrentPage, totalPages = companies.TotalPages, previousPageLike, nextPageLinke }; Response.Headers.Add("X-Pagenation", JsonSerializer.Serialize(pagenationMetadata, new JsonSerializerOptions { Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping })); if (companies == null) { return(NotFound()); } //进行映射 var companyDto = _mapper.Map <IEnumerable <CompanyDto> >(companies); //var companyDto = new List<CompanyDto>(); //foreach (var company in companies) //{ // companyDto.Add(new CompanyDto // { // Id = company.Id, // Name = company.Name // }); //} //return new JsonResult(companies); return(Ok(companyDto)); }
public async Task <IEnumerable <Company> > GetCompaniesAsync(CompanyDtoParameters parameters) { var item = _routineDBContext.Company as IQueryable <Company>; if (!string.IsNullOrWhiteSpace(parameters.CompanyName)) { item = item.Where(x => x.Name.Contains(parameters.CompanyName)); } if (!string.IsNullOrWhiteSpace(parameters.SearchTerm)) { item = item.Where(x => x.Introduction.Contains(parameters.SearchTerm) || x.Name.Contains(parameters.SearchTerm)); } item = item.Skip(parameters.PageSize * (parameters.PageNumber - 1)).Take(parameters.PageSize); return(await item.ToListAsync()); }
private IEnumerable <LinkDto> CreateLinksForCiampany(CompanyDtoParameters parameters, bool haspre = false, bool hasnext = false) { var links = new List <LinkDto>(); links.Add(new LinkDto(CreateCompaniesResourceUri(parameters, ResourceUriType.CurrentPage), "self", "GET")); if (haspre) { links.Add(new LinkDto(CreateCompaniesResourceUri(parameters, ResourceUriType.PreviousPage), "Previous_page", "GET")); } if (hasnext) { links.Add(new LinkDto(CreateCompaniesResourceUri(parameters, ResourceUriType.NextPage), "Next_page", "GET")); } return(links); }
[HttpHead] //添加对 Http Head 的支持,使用 Head 请求时不会返回 Body public async Task <IActionResult> GetCompanies([FromQuery] CompanyDtoParameters parameters) //Task<IActionResult> = Task<ActionResult<List<CompanyDto>>> { var companies = await _companyRepository.GetCompaniesAsync(parameters); //向 Header 中添加翻页信息(视频P35) //上一页的 URI var previousPageLink = companies.HasPrevious ? CreateCompaniesResourceUri(parameters, ResourceUnType.PreviousPage) : null; //下一页的 URI var nextPageLink = companies.HasNext ? CreateCompaniesResourceUri(parameters, ResourceUnType.NextPage) : null; var paginationMetdata = new { totalCount = companies.TotalCount, pageSize = companies.PageSize, currentPage = companies.CurrentPage, totalPages = companies.TotalPages, previousPageLink, nextPageLink }; Response.Headers.Add("X-Pagination", JsonSerializer.Serialize(paginationMetdata, new JsonSerializerOptions //URI 中的‘&’、‘?’符号不应该被转义,因此改用不安全的 Encoder { Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping })); //不使用 AutoMapper //var companyDtos = new List<CompanyDto>(); //foreach(var company in companies) //{ // companyDtos.Add(new CompanyDto // { // Id = company.Id, // Name = company.Name // }); //} //使用 AutoMapper(视频P12) var companyDtos = _mapper.Map <IEnumerable <CompanyDto> >(companies); return(Ok(companyDtos)); //OK() 返回状态码200 }
public async Task <IActionResult> GetCompanies([FromQuery] CompanyDtoParameters parameters) { var companies = await _companyRepository.GetCompaniesAsync(parameters); var previousPageLink = companies.HasPrevious ? CreateCompaniesResourceUri(parameters, ResourceUriType.PreviousPage) : null; var nextPageLink = companies.HasNext ? CreateCompaniesResourceUri(parameters, ResourceUriType.NextPage) : null; var paginationMetadate = new { totalCount = companies.ToTalCount, pageSize = companies.PageSize, currentPage = companies.CurrentPage, totalPages = companies.ToTalPages, previousPageLink, nextPageLink }; Response.Headers.Add("X-Pagination", JsonSerializer.Serialize(paginationMetadate, new JsonSerializerOptions { Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping })); var companyDto = _mapper.Map <IEnumerable <CompanyDto> >(companies); var shape = companyDto.ShapeData(parameters.Fields); var links = createLinksForCompany(parameters); var shapedCompaniesWithLinks = shape.Select(c => { var companyDict = c as IDictionary <string, Object>; var companyLinks = CreatLinkForCompany((Guid)companyDict["Id"], null); companyDict.Add("links", companyLinks); return(companyDict); }); var linkedCollectionResource = new { value = shapedCompaniesWithLinks, links }; return(Ok(linkedCollectionResource)); }