为了账号安全,请及时绑定邮箱和手机立即绑定

WebAPI 控制器看不到价值

WebAPI 控制器看不到价值

C#
收到一只叮咚 2021-11-14 10:48:09
我有发送邮件控制器这是接口代码  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();    }}这是 SendEmail 类的代码public class EmailService: IEmailService{    private readonly IConfiguration _configuration;    public EmailService(IConfiguration configuration)    {        _configuration = configuration;    }    public async Task SendEmail(string email, string subject, string message)    {        using (var client = new SmtpClient())        {            var credential = new NetworkCredential            {                UserName = _configuration["Email:Email"],                Password = _configuration["Email:Password"]            };            client.Credentials = credential;            client.Host = _configuration["Email:Host"];            client.Port = int.Parse(_configuration["Email:Port"]);            client.EnableSsl = true;            using (var emailMessage = new MailMessage())            {                emailMessage.To.Add(new MailAddress(email));                emailMessage.From = new MailAddress(_configuration["Email:Email"]);                emailMessage.Subject = subject;                emailMessage.Body = message;                client.Send(emailMessage);            }        }        await Task.CompletedTask;    }}我尝试通过邮递员检查发布请求并将此 json 发送到此 url - https://localhost:5001/api/send-email{ "email": "suhomlin.eugene93@gmail.com", "subject": "Get Medicine", "message": null }但是我收到错误消息,该电子邮件为空。这是错误的屏幕我不明白,为什么?我的错误在哪里?
查看完整描述

2 回答

?
叮当猫咪

TA贡献1776条经验 获得超12个赞

尝试修改,为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();

    }

现在您的邮递员服务将按预期工作,从 Request Body


编辑 1


以下是其他选项,以防您想使用查询字符串发送数据:


public async Task<string> SendEmailAsync(string email, string subject, string message) 或者


public async Task<string> SendEmailAsync([FromUri]Data d)


在上述两种情况下,以下查询都有效:


https://localhost:5001/api/send-email?subject=Get Medicine&email=suhomlin.eugene93@gmail.com

尽管第一个具有优先级,请注意,我没有在参数中传递消息,因为它在原始查询和顺序或参数中为 null 可以是任何内容。


正如讨论中所建议的,如果Data没有明确限定,那么它期望 Json 数据作为 Http Request Body


查看完整回答
反对 回复 2021-11-14
?
杨魅力

TA贡献1811条经验 获得超6个赞

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


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


public class SendEmailRequest

{

    public string Email {get; set;}

    ...

}

2)按照评论中的建议执行 FromBody


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


查看完整回答
反对 回复 2021-11-14
  • 2 回答
  • 0 关注
  • 140 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信