语法错误:JSON Aurelia中意外的令牌<



我正在使用Aurelia来构建Web应用程序。我想显示从列表视图传递参数 (id) 的详细信息页面。这是我的(简化,"细节"是基本数据类)控制器代码:

[HttpGet("[action]")]
public IActionResult GetDetail(int _id)
{
var b = new Detail()
var customjson = JsonConvert.SerializeObject(b, Formatting.Indented);
return Ok(customjson);
}

详细信息通过 detail.ts 类中的activate()方法获取:

constructor(http: HttpClient) {
this.http = http;
}
activate(params: any) {
this.http.fetch("api/Begroting/GetBegroting/" + params.id)
.then(result => result.json as Promise<Begroting>)
.then(data => {
this.begroting = data;
console.log(data);
});
}

但是,当通过列表页面加载详细信息页面时,它会给出此错误:

未捕获(在承诺中)语法错误:JSON 中位置 0 处出现意外的令牌<。通过 Swagger 测试 API 会生成有效的 json 和状态代码 200。

暗示 API(调用)有问题。

OP 已经解决了他的问题,但为了向未来的读者澄清可能发生的事情:

SyntaxError: Unexpected token < in JSON是请求不存在的资源时通常发生的错误。服务器返回标准的404HTML 错误响应。

然后,当客户端尝试将 HTML 文档解析为 JSON 时,客户端将失败(这是失败的<html>标记的第一个<)。

客户端需要状态代码而不是错误页

这里更深层次的问题是,服务器应该真正返回404状态代码响应,以便客户端知道请求失败,并且不会尝试像成功一样处理它。毕竟,404 错误 html 页面附带一个200状态代码。

因此,除了在客户端(或服务器端)修复请求 url 之外,还应配置服务器和/或客户端,以便返回正确的状态代码。我相信Accept: application/json会解决这个问题,尽管我还没有测试过。

OP的替代解决方案:

RESTful 服务背后的想法是,您的 URI 代表资源;查询字符串非常适合对列表上的参数进行排序/过滤/分页等。ID 类型属于路径,而不是查询字符串。

将路由属性更改为:[HttpGet("[action]/{_id}")],初始客户端代码应再次工作。

我们调用了 api/Begroting/GetBegroting/_id,而不是将 id 指定为 GET 参数。结果是对 api 的调用将我们重新路由回 index.html。因此,意外的令牌

要修复它,请将 API 调用更改为 api/Begroting/GetBegroting/?_id= + params.id

相关内容

最新更新