我使用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);
});
}
但是,当通过列表页面加载详细信息页面时,会出现此错误:
Uncaught(在promise中)SyntaxError:意外的标记&lt;在位置0的JSON中。通过Swagger测试API会产生有效的json和状态代码200。
暗示API(调用)存在问题。
答案 0 :(得分:2)
SyntaxError: Unexpected token < in JSON
是在您请求不存在的资源时通常会发生的错误。服务器返回标准的404
HTML错误响应。
当客户端尝试将HTML文档解析为JSON时,它将失败(它是失败的<
标记的第一个<html>
。
这里更深层次的问题是服务器应该真正返回404
状态代码响应,以便客户端知道请求失败,并且不会尝试处理它,就好像它一样成功了。毕竟,404错误html页面附带了200
状态代码。
因此,除了在客户端(或服务器端的路由)上修复请求URL之外,还应配置服务器和/或客户端,以便返回正确的状态代码。我相信Accept: application/json
会照顾这个,虽然我没有测试过。
RESTful服务背后的想法是你的URI代表资源;查询字符串很适合在列表上排序/过滤/分页参数等。 ID类型属于路径,而不是查询字符串。
将您的路线属性更改为:[HttpGet("[action]/{_id}")]
,您的初始客户端代码应该再次有效。
答案 1 :(得分:1)
我们调用了api / Begroting / GetBegroting / _id,而不是将id指定为GET参数。结果是对api的调用将我们重新路由回index.html。因此意外的令牌&lt;在JSON Aurelia错误。
要解决此问题,请将API调用更改为api / Begroting / GetBegroting /?_ id = + params.id