从Angular 7 SPA到.NET的媒体类型不支持415,而请求在Postman中工作
当SPA调用.NET API中的特定端点(我最近添加了分页)时,我得到一个415不支持的媒体类型错误,但是,当我从Postman发出相同的调用时,它成功执行。我不知道为什么SPA会给我一个相同的邮递员电话 我已经从Postman测试了端点,发现它正在工作,并验证了我正在从SPA调用相同的端点 前端呼叫:从Angular 7 SPA到.NET的媒体类型不支持415,而请求在Postman中工作,.net,angular,postman,angular7,.net,Angular,Postman,Angular7,当SPA调用.NET API中的特定端点(我最近添加了分页)时,我得到一个415不支持的媒体类型错误,但是,当我从Postman发出相同的调用时,它成功执行。我不知道为什么SPA会给我一个相同的邮递员电话 我已经从Postman测试了端点,发现它正在工作,并验证了我正在从SPA调用相同的端点 前端呼叫: fetchChanges(page?, itemsPerPage?){ const paginatedResult: PaginatedResult<Change[]>
fetchChanges(page?, itemsPerPage?){
const paginatedResult: PaginatedResult<Change[]> = new PaginatedResult<Change[]>();
let params = new HttpParams();
if (page != null && itemsPerPage != null){
params = params.append("pageNumber", page);
params = params.append("pageSize", itemsPerPage);
}
return this.http.get(
this.apiUrl + '/changelog/' + this.model, { observe: "response", params })
.pipe(
map((responseData: any) => {
paginatedResult.result = responseData.body;
if (responseData.headers.get("Pagination") != null){
paginatedResult.pagination = JSON.parse(responseData.headers.get("Pagination"));
}
return paginatedResult;
})
)
}
端点的控制器函数:
[HttpGet("{model}")]
public async Task<IActionResult> GetChangeLog(int userId, string model, ChangeLogParams changeLogParams)
{
if (userId != int.Parse(User.FindFirst(ClaimTypes.NameIdentifier).Value))
return Unauthorized();
var changeLog = await _repo.GetChangeLog(userId, model, changeLogParams);
var changeLogForReturn = _mapper.Map<IEnumerable<ChangelogForReturnDto>>(changeLog);
Response.AddPagination(changeLog.CurrentPage, changeLog.PageSize, changeLog.TotalCount, changeLog.TotalPages);
return Ok(changeLogForReturn);
}
我希望前端执行请求,并返回分页结果
应用程序的代码可在此处找到:
在检查了我的标题后,我意识到我在Postman中将内容设置为JSON,这是post/put/patch自动完成的,但当然不是get。这让我意识到我仍然在邮递员中设置了登录请求主体。在清除主体之后,我得到了一个400请求主体不能设置为null的错误,这使我意识到出于某种原因,我的端点希望我的get请求包含一个请求主体
[HttpGet("{model}")]
public async Task<IActionResult> GetChangeLog(int userId, string model, ChangeLogParams changeLogParams)
{
if (userId != int.Parse(User.FindFirst(ClaimTypes.NameIdentifier).Value))
return Unauthorized();
var changeLog = await _repo.GetChangeLog(userId, model, changeLogParams);
var changeLogForReturn = _mapper.Map<IEnumerable<ChangelogForReturnDto>>(changeLog);
Response.AddPagination(changeLog.CurrentPage, changeLog.PageSize, changeLog.TotalCount, changeLog.TotalPages);
return Ok(changeLogForReturn);
}
回顾代码之后,我发现问题在于后端的ChangeLogParams参数应该作为请求主体
将[FromQuery]添加到ChangeLogParams参数,以从参数而不是请求正文获取分页数据,解决了我的问题
[HttpGet("{model}")]
public async Task<IActionResult> GetChangeLog(int userId, string model, [FromQuery]ChangeLogParams changeLogParams)
{
if (userId != int.Parse(User.FindFirst(ClaimTypes.NameIdentifier).Value))
return Unauthorized();
var changeLog = await _repo.GetChangeLog(userId, model, changeLogParams);
var changeLogForReturn = _mapper.Map<IEnumerable<ChangelogForReturnDto>>(changeLog);
Response.AddPagination(changeLog.CurrentPage, changeLog.PageSize, changeLog.TotalCount, changeLog.TotalPages);
return Ok(changeLogForReturn);
}
请检查this.model中以下行的值:this.apirl+'/changelog/'+this.model,{observe:response,params}。您是否在前端设置了正确的标题?我看到您在PostMant中设置了4个头Hank you,我决不会在Postman中查看我的头来意识到我正在格式化请求体,并发现我的问题是我的ChangeLogParams参数需要请求体,而不是从我的查询参数获取此数据。