Blazor传递订单号调用API失败:无JSON令牌错误排查
问题分析与修复方案
核心问题:路由不匹配导致API请求未被正确处理
你的API断点没触发、前端报“输入不包含任何JSON令牌”,本质是请求URL和API路由规则不匹配——API根本没接收到请求,返回的大概率是404页面(非JSON格式),所以GetFromJsonAsync解析失败。
具体问题点及修复:
API路由与请求路径不匹配
- API控制器的路由前缀是
api/application/workorder,但前端请求路径是api/workorder/{订单号},缺少application层级,导致请求找不到对应接口。 - 同时,
HttpGet方法未定义路由参数模板,无法从URL中捕获orderNumber。
- API控制器的路由前缀是
修复后的API控制器代码
修改HttpGet特性,添加参数路由模板,确保能匹配带订单号的请求:[ApiController] [Route("api/application/workorder")] [Tags("AM Application Data")] public class WorkorderController : ControllerBase { private readonly IMediator _mediator; public WorkorderController(IMediator mediator) { _mediator = mediator; } // 新增路由参数模板 {orderNumber},明确从路由捕获参数 [HttpGet("{orderNumber}")] public async Task<IActionResult> Get([FromRoute] string orderNumber) { var request = new Workorder.Request() { Name = "Work Order", OrderNumber = orderNumber, }; var response = await _mediator.Send(request); return Ok(response); } }修复前端请求路径
前端请求路径需和API路由前缀对齐,加上application层级;同时建议对订单号做URL编码(当前示例的_和-是URL安全字符,但编码能避免后续特殊字符引发的问题):private async Task<WorkorderDTO> Lookup() { var encodedOrderNumber = Uri.EscapeDataString(_model.OrderNumber); var path = $"api/application/workorder/{encodedOrderNumber}"; var response = await _apiService.GetFromJsonAsync<WorkorderDTO>(path, CancellationToken.None); return response; }
额外验证点
- 确认本地请求URL应为:
https://localhost:44318/api/application/workorder/ABC_A14Y9-TS78,与修改后的路由规则匹配。 - 如果API仍未触发断点,检查API服务启动端口是否为44318,且前端请求的域名/端口与API一致。
内容的提问来源于stack exchange,提问作者user22019322
相关产品推荐
相关产品推荐

