public async Task <IActionResult> GetArticleByArticleId(Guid articleId, string fields, [FromHeader(Name = "Accept")] string mediaType)//获取媒体类型的数值 { //解析媒体资源类型 if (!MediaTypeHeaderValue.TryParse(mediaType, out MediaTypeHeaderValue parseMediaType)) { return(BadRequest()); } //确认是否存在该字段 if (!_propertyCheckService.TypeHasProperties <ArticleDetailsViewModel>(fields)) { return(BadRequest()); } var article = await _articleService.GetArticleDetailsByArticleIdAsync(articleId); if (article.Id == Guid.Empty) { return(NotFound()); } //expandoObject实质上是一个字典 var result = article.ShapeData(fields) as IDictionary <string, object>; //判断媒体类型并返回不同的结果 if (parseMediaType.MediaType == "application/vnd.company.hateoas+json") { var link = CreateLinksForArticle(articleId, fields); result.Add("links", link); return(Ok(result)); } return(Ok(result)); }
public async Task <ActionResult> Get(int autoId, [FromQuery] GasLogResourceParameters resourceParameters) { //var userId = User.Claims.FirstOrDefault(c => c.Type == "sub")?.Value; //if (userId == null) //{ // var errorMsg = "Cannot get author information with null user id"; // Log.Error(errorMsg); // return BadRequest(errorMsg); //} //var user = _userManager.GetEntities().FirstOrDefault(u => u.Id == Guid.Parse(userId)); //if (user == null) //{ // return OK(new List<ApiGasLog>()); //} if (!string.IsNullOrEmpty(resourceParameters.OrderBy)) { if (!_propertyMappingService.ValidMappingExistsFor <ApiGasLog, GasLog>(resourceParameters.OrderBy)) { return(BadRequest(new ApiBadRequestResponse(_propertyMappingService.ProcessingResult.GetWholeMessage()))); } var mapDictionary = _propertyMappingService.GetPropertyMapping <ApiGasLog, GasLog>(); resourceParameters.OrderBy = resourceParameters.OrderBy.GetMappedSortClause(mapDictionary); } if (!string.IsNullOrEmpty(resourceParameters.Fields)) { if (!_propertyCheckService.TypeHasProperties <ApiGasLog>(resourceParameters.Fields)) { return(BadRequest(new ApiBadRequestResponse(_propertyMappingService.ProcessingResult.GetWholeMessage()))); } } var gasLogs = await _gasLogManager.GetGasLogsAsync(autoId, resourceParameters); if (!gasLogs.Any()) { return(NotFound()); } return(Ok(gasLogs)); }
[HttpHead] //httphead返回body,但状态码也是200 //public async Task<ActionResult<IEnumerable<CompanyDto>>> GetCompanies( public async Task <IActionResult> GetCompanies([FromQuery] CompanyParameters parameters) //IActionResult可以用具体的实现类ActionResult<T>,返回的类型明确 { //return 400 if (!_propertyMappingService.ValidMappingExistsFor <CompanyDto, Company>(parameters.OrderBy)) { return(BadRequest()); } //return 400 if (!_propertyCheckService.TypeHasProperties <CompanyDto>(parameters.Fields)) { return(BadRequest()); } var companies = await _companyRepository.GetCompaniesAsync(parameters); //var previousLink = companies.HasPrevious // ? CreateCompaniesRessourceUri(parameters, ResourceUriType.PreviousPage) // : null; //var nextLink = companies.HasNext // ? CreateCompaniesRessourceUri(parameters, ResourceUriType.NextPage) // : null; var paginationMetaData = new { totalCount = companies.TotalCount, pageSize = companies.PageSize, currentPage = companies.CurrentPage, totalPages = companies.TotalPages, //previousPageLink =previousLink, //nextPageLink =nextLink }; Response.Headers.Add("X-Pagination", JsonSerializer.Serialize(paginationMetaData, new JsonSerializerOptions { Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping //不 转义 })); //var companiesDto = new List<CompanyDto>(); //replaced by Linq //foreach (var company in companies) //{ // companiesDto.Add(new CompanyDto // { // Id=company.Id, // Name = company.Name // }); //} //companies.ToList().ForEach(company=>companiesDto.Add(new CompanyDto //{ // Id = company.Id, // CompanyName = company.Name //})); //Auto mapper var companiesDtos = _mapper.Map <IEnumerable <CompanyDto> >(companies); var shapedData = companiesDtos.ShapeData(parameters.Fields); // return new JsonResult(companies); //return Json var links = CreateLinksForCompany(parameters, companies.HasPrevious, companies.HasNext); //对于集合资源,返回对象有这些属性 //{value:[xxx]集合,links 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, paging = links }; return(Ok(linkedCollectionResource)); }