C# WebAPI控制器don';我看不出有什么价值

C# WebAPI控制器don';我看不出有什么价值,c#,asp.net-web-api,asp.net-core,asp.net-core-mvc,C#,Asp.net Web Api,Asp.net Core,Asp.net Core Mvc,我有一个电子邮件控制器 下面是接口代码 public interface IEmailService { Task SendEmail(string email, string subject, string message); } 这是API控制器 [Route("api/send-email")] [ApiController] public class EmailController : ControllerBase { private reado

我有一个电子邮件控制器

下面是接口代码

  public interface IEmailService
   {
       Task SendEmail(string email, string subject, string message);
   }
这是API控制器

 [Route("api/send-email")]
[ApiController]
public class EmailController : ControllerBase
{
    private readonly IEmailService _emailService;
    public EmailController(IEmailService emailService)
    {
        _emailService = emailService;
    }

    [HttpPost]
    public async Task<IActionResult> SendEmailAsync(string email, string subject, string message)
    {
        await _emailService.SendEmail(email, subject, message);
        return Ok();
    }

}
我试图通过邮递员检查post请求,并将此json发送到此url-
https://localhost:5001/api/send-电子邮件

{ “电子邮件”:“苏霍姆林。eugene93@gmail.com", “主题”:“获取药物”, “消息”:空 }

但我有一个错误,那封邮件是空的。 这是错误的屏幕


我不明白,为什么?我的错误在哪里?

我认为POST请求的绑定方式与默认情况下GET请求的绑定方式不同。为此,您可以做两件事:

1) 创建一个请求对象而不是3个字符串

public class SendEmailRequest
{
    public string Email {get; set;}
    ...
}
2) 按照评论中的建议执行FromBody


我建议使用前者,我认为这是一种更干净的方式,我在应用程序中使用了这种方式。

我认为POST请求的绑定方式与默认情况下GET请求的绑定方式不同。为此,您可以做两件事:

1) 创建一个请求对象而不是3个字符串

public class SendEmailRequest
{
    public string Email {get; set;}
    ...
}
2) 按照评论中的建议执行FromBody


我建议使用前者,我认为这是一种更干净的方法,我在我的应用程序中使用了这种方法。

尝试修改,为API创建一个具有数据属性的实体类:

public class Data
{
  public string email {get;set;}
  public string subject {get;set;}
  public string message {get;set;}
}
现在更改API服务,如下所示:

[HttpPost]
    public async Task<IActionResult> SendEmailAsync([FromBody] Data d)
    {
        await _emailService.SendEmail(d.email, d.subject, d.message);
        return Ok();
    }
尽管第一个具有优先级,请注意,我不是在参数中传递消息,因为它在原始查询中为null,并且顺序或参数可以是任何内容


正如讨论中所建议的,如果
数据
没有明确限定,那么它希望Json数据作为Http请求主体

尝试修改,创建一个实体类,其中包含API的数据属性:

public class Data
{
  public string email {get;set;}
  public string subject {get;set;}
  public string message {get;set;}
}
现在更改API服务,如下所示:

[HttpPost]
    public async Task<IActionResult> SendEmailAsync([FromBody] Data d)
    {
        await _emailService.SendEmail(d.email, d.subject, d.message);
        return Ok();
    }
尽管第一个具有优先级,请注意,我不是在参数中传递消息,因为它在原始查询中为null,并且顺序或参数可以是任何内容



正如讨论中所建议的,如果
数据
没有明确限定,那么它希望Json数据作为Http请求体

您可以发布您得到的确切错误和Http状态代码吗?我更新了我的帖子。500 http代码@Ilyachernomordik大多数情况下,您从Postman调用控制器的方式存在错误,使用json数据发布准确的url,因此无法绑定。我更新了我的帖子@MrinalKambojAre。如果您将json数据作为正文传递,则需要[FromBody]属性绑定正确你能发布你得到的确切错误和HTTP状态代码吗?我更新了我的帖子。500 http代码@Ilyachernomordik您从Postman调用控制器的方式有一个错误,使用json数据发布准确的url,它无法绑定,因此我更新了我的post@MrinalKambojAre您将json数据作为Body传递,然后需要[FromBody]属性来正确绑定我制作了FromBody,现在我在Postman
{''中得到了这一点:[“解析值时遇到意外字符:{.Path“”,第1行,位置1。”]}
请尝试按照第一点中的建议创建一个请求对象,也许您的主体不是完全有效的JSON?您可以在一些联机检查程序中验证它,以确保我从主体生成,现在我在postman
{”“:[”分析值时遇到意外字符:{.Path“”,第1行,位置1。“]}
试着按照第一点的建议创建一个请求对象,也许你的主体不是一个完全有效的JSON?你可以在一些在线检查器中验证它,以确保你真的不需要对象的FromBody。我认为,它是自动绑定的,只有字符串之类的值参数需要,我可以测试iit,在我的理解中它显式地有帮助使用请求体传递json数据的序列化@IlyaChernomordik说,模型绑定器将在请求体中查找比基类型更复杂的内容在这种情况下,parameter属性是冗余的。我会将模型命名为除
数据
-电子邮件如何?@phuzi在这种情况下,它可能是冗余的,因为其他参数(如Uri)不可用,但通常有助于与其他参数(如使用Uri和正文发送mix时)分离,因此通常是一个好方法练习定义数据应发送到服务的位置和方式。
数据
只是一个占位符,应根据项目要求适当命名。您不需要对象的FromBody,我认为它是自动绑定的,只有字符串等值参数需要,我可以测试iit,我的理解它在seria中有明确帮助使用请求体传递json数据的实现正如@IlyaChernomordik所说,模型绑定器将在请求体中查找比基类型更复杂的任何内容在这种情况下,parameter属性是冗余的。我会将模型命名为除
数据
-电子邮件如何?@phuzi在这种情况下,它可能是冗余的,因为其他参数(如Uri)不可用,但通常有助于与其他参数(如使用Uri和正文发送mix时)分离,因此通常是一个好方法定义数据发送到服务的位置和方式的实践。
数据
只是一个占位符,应根据项目要求适当命名