解析值时遇到错误意外字符:。路径 '',第 1 行,位置 1

Getting error unexpected character encountered while parsing value: . Path '', line 1, position 1

我有一个 ASP.Net Core 2.1 应用程序。我收到与下面 SO link.

中提到的相同的错误

答案部分中建议的解决方案似乎也能解决问题。

但是为一个 属性 创建一个 class 是开销很大并且对我没有吸引力。

过去,我使用 .Net Framework 4.5(+)

时也没有产生这样的开销 class
// POST api/values
[HttpPost]
public void Post([FromBody]string email)
{
}

通过 Postman,我 POST

{
    "email": "myemail@email.com"
}

如何在不创建任何 class 的情况下将电子邮件值传递给 API 或 这样的?

我更愿意坚持 [FromBody],因为我的应用程序中的所有 API 都接受 Post 方法中的参数 FromBody

如果您想在不创建 class 的情况下传递电子邮件值,只需传递

"myemail@email.com"

没有 {} 括号和 email 键。当你通过

{
"email": "myemail@email.com"
}

解析器正确地建议此值表示具有 属性 email 的对象,这就是为什么需要包装器 class。

您可以简单地输入一个没有密钥的字符串,api 仍然会接受它:

"myemail@email.com"

如果您知道自己需要一个参数,那么继续将它变成一个字符串,就像其他人一样有建议。但请记住,您将无法从 ASP.NET 中的正文中接收两个参数 核心:您将必须定义一个包含两个(或更多)属性的类型,并且请求正文中的单个对象将是映射到该类型。因此,如果您不确定,只需为您自己省去未来的重构并为您的请求定义一个类型

不要害怕在你的项目中再创建一个 class。 这对机器来说是一个非常小的开销,对你来说是一个微不足道的烦恼花三分钟编写它,但它可以提高代码质量,使其更具表现力,甚至可以让编译器发现您可能没有注意到的错误,从而帮助您。只需 给它一个有意义的名称 ,就可以了。

您可能需要调用 JSON.stringify(email) 将电子邮件传递给 api,并将内容类型作为 header。我就是这样解决问题的:

post(id: number, email: string): Observable<any> {
    const httpOptions = {
      headers: new HttpHeaders({'Content-Type': 'application/json'})
    };
    const url = this.baseUrl + `api/Portfolio/InviteUser/${id}`;
    return this.http.post<any>(url, JSON.stringify(email), httpOptions);
  }

我的网站 Api 还在 URI 中包含一个 ID:

[HttpPost("[action]/{id}")]
public async Task<ActionResult<Response>> InviteUser(int id, [FromBody] string email)