猿问

WebAPI 控制器看不到价值

我有发送邮件控制器


这是接口代码


  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 }


但是我收到错误消息,该电子邮件为空。这是错误的屏幕

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


收到一只叮咚
浏览 141回答 2
2回答

叮当猫咪

尝试修改,为API创建一个带有数据属性的实体类:public class Data{&nbsp; public string email {get;set;}&nbsp; public string subject {get;set;}&nbsp; public string message {get;set;}}现在更改 API 服务如下:[HttpPost]&nbsp; &nbsp; public async Task<IActionResult> SendEmailAsync([FromBody] Data d)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; await _emailService.SendEmail(d.email, d.subject, d.message);&nbsp; &nbsp; &nbsp; &nbsp; return Ok();&nbsp; &nbsp; }现在您的邮递员服务将按预期工作,从 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

杨魅力

我认为 POST 请求的绑定方式与您期望默认绑定 GET 请求的方式不同。您可以为此做两件事:1)创建一个请求对象而不是3个字符串public class SendEmailRequest{&nbsp; &nbsp; public string Email {get; set;}&nbsp; &nbsp; ...}2)按照评论中的建议执行 FromBody我建议前者,我认为这是一种更简洁的方式,我在我的应用程序中使用了这种方法。
随时随地看视频慕课网APP
我要回答