Nswag/Angular 在错误事件中显示 API 错误信息
Nswag/Angular display API error message in error event
首先,我在后端使用 CQRS 架构 API 并使用 NSWAG 作为 API 连接;在前端 Angular.
的服务代理中生成 API 个端点
我对 POST API 进行了简单验证,同时测试创建的 API 结果在 DevTools 中有所不同。
在“网络”选项卡中,我预期的验证发生在“控制台”选项卡中
结果不同;事实上,结果是我需要的。
这是我的问题。详细配图
API 调用代码
saveLocationType(createLocationTypeCommand){
this.tenantService.createLocationType(createLocationTypeCommand).subscribe(result => {
// Do Something
}, error => {
console.log(error);
})
}
这是我在“网络”选项卡中 API 的验证结果,是正确的。
这是我在控制台中的问题这里的结果必须与网络选项卡中的相同。
我相信控制台中的结果来自服务代理,因为这是 generates/formatting 前端的 API。
有没有办法配置NSWAG生成的服务代理?或者是否有其他方式在控制台选项卡中显示与网络选项卡相同的错误消息?
如果您使用 angular http 客户端,请尝试使用 responseType 文本选项。
return this.http.post(url,body, {responseType: 'text'}).subscribe()
客户端默认尝试将响应处理为 responseType: 'json'。
他尝试将此响应解析为 json,但失败并引发此错误。
有关非 Json 响应机构的更多信息,您可以在此处找到:https://angular.io/guide/http#requesting-non-json-data
我使用这些参考资料解决了我的问题:
- https://github.com/RicoSuter/NSwag/issues/2327
- https://lurumad.github.io/problem-details-an-standard-way-for-specifying-errors-in-http-api-responses-asp.net-core
C# Web 中的代码段 API 我实施以解决我的问题
[HttpPost("setup/locationType", Name = "createLocationType")]
[ProducesResponseType((int)HttpStatusCode.OK)]
[ProducesResponseType(typeof(ValidationProblemDetails), (int)HttpStatusCode.BadRequest)]
public async Task<IActionResult> CreateLocationTypeAsync([FromBody] CreateLocationTypeCommand command)
{
try
{
var commandResult = await _mediator.Send(command);
if (!commandResult)
{
return BadRequest();
}
return Ok();
}
catch(Exception ex)
{
var problemDetails = new ValidationProblemDetails
{
Status = (int)HttpStatusCode.BadRequest,
Type = "",
Title = "Create Location Type",
Detail = ex.Message,
Instance = HttpContext.Request.Path
};
return new ObjectResult(problemDetails)
{
ContentTypes = { "application/problem+json" },
StatusCode = (int)HttpStatusCode.BadRequest,
};
}
}
谢谢!
首先,我在后端使用 CQRS 架构 API 并使用 NSWAG 作为 API 连接;在前端 Angular.
的服务代理中生成 API 个端点我对 POST API 进行了简单验证,同时测试创建的 API 结果在 DevTools 中有所不同。
在“网络”选项卡中,我预期的验证发生在“控制台”选项卡中 结果不同;事实上,结果是我需要的。
这是我的问题。详细配图
API 调用代码
saveLocationType(createLocationTypeCommand){
this.tenantService.createLocationType(createLocationTypeCommand).subscribe(result => {
// Do Something
}, error => {
console.log(error);
})
}
这是我在“网络”选项卡中 API 的验证结果,是正确的。
这是我在控制台中的问题这里的结果必须与网络选项卡中的相同。
我相信控制台中的结果来自服务代理,因为这是 generates/formatting 前端的 API。
有没有办法配置NSWAG生成的服务代理?或者是否有其他方式在控制台选项卡中显示与网络选项卡相同的错误消息?
如果您使用 angular http 客户端,请尝试使用 responseType 文本选项。
return this.http.post(url,body, {responseType: 'text'}).subscribe()
客户端默认尝试将响应处理为 responseType: 'json'。 他尝试将此响应解析为 json,但失败并引发此错误。
有关非 Json 响应机构的更多信息,您可以在此处找到:https://angular.io/guide/http#requesting-non-json-data
我使用这些参考资料解决了我的问题:
- https://github.com/RicoSuter/NSwag/issues/2327
- https://lurumad.github.io/problem-details-an-standard-way-for-specifying-errors-in-http-api-responses-asp.net-core
C# Web 中的代码段 API 我实施以解决我的问题
[HttpPost("setup/locationType", Name = "createLocationType")]
[ProducesResponseType((int)HttpStatusCode.OK)]
[ProducesResponseType(typeof(ValidationProblemDetails), (int)HttpStatusCode.BadRequest)]
public async Task<IActionResult> CreateLocationTypeAsync([FromBody] CreateLocationTypeCommand command)
{
try
{
var commandResult = await _mediator.Send(command);
if (!commandResult)
{
return BadRequest();
}
return Ok();
}
catch(Exception ex)
{
var problemDetails = new ValidationProblemDetails
{
Status = (int)HttpStatusCode.BadRequest,
Type = "",
Title = "Create Location Type",
Detail = ex.Message,
Instance = HttpContext.Request.Path
};
return new ObjectResult(problemDetails)
{
ContentTypes = { "application/problem+json" },
StatusCode = (int)HttpStatusCode.BadRequest,
};
}
}
谢谢!