【问题标题】:WebAPI controller don't see valueWebAPI 控制器看不到价值
【发布时间】:2019-01-11 00:57:30
【问题描述】:

我有 sendemail 控制器

这是接口代码

  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

{ “电子邮件”:“suhomlin.eugene93@gmail.com”, “主题”:“获取药物”, “消息”:空 }

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

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

【问题讨论】:

  • 你能发布你得到的确切错误和 HTTP 状态代码吗?
  • 我更新了我的帖子。 500个http代码。 @IlyaChernomordik
  • 大部分是你从 Postman 调用控制器的方式有误,用 json 数据发布准确的 url,因此无法绑定
  • 我更新了我的帖子@MrinalKamboj
  • 你是否将Json数据作为Body传递,那么这需要[FromBody]属性才能正确绑定

标签: c# asp.net-web-api asp.net-core asp.net-core-mvc


【解决方案1】:

尝试修改,创建一个带有 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

如果您热衷于使用查询字符串发送数据,以下是其他选项:

  1. public async Task&lt;string&gt; SendEmailAsync(string email, string subject, string message) 或者

  2. public async Task&lt;string&gt; SendEmailAsync([FromUri]Data d)

在上述两种情况下,以下查询都可以工作:

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

虽然第一个具有优先级,但请注意,我没有在参数中传递消息,因为它在您的原始查询中为空,并且订单或参数可以是任何东西。

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

【讨论】:

  • 我认为对象不需要 FromBody,它是自动绑定的,只有像字符串这样的值参数才需要
  • 我可以根据我的理解测试 iit,它明确有助于序列化使用请求正文传递的 json 数据
  • 正如@IlyaChernomordik 所说,模型绑定器将在请求的主体中查找比基本类型更复杂的任何内容。在这种情况下,`[FromBody] 参数属性是多余的。
  • 除了Data,我可以给模型命名——Email 怎么样?
  • @phuzi 在这种情况下,由于 Uri 等其他参数不可用,它可能是多余的,但通常有助于与其他参数分离,例如使用 Uri 和 Body 发送混音时,所以一般来说实践定义数据应发送到服务的位置和方式。 Data 只是一个占位符,应根据项目要求适当命名
【解决方案2】:

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

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

public class SendEmailRequest
{
    public string Email {get; set;}
    ...
}

2) 按照 cmets 中的建议执行 FromBody

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

【讨论】:

  • 我从body中制作,现在我在邮递员{"":["Unexpected character encountered while parsing value: {. Path '', line 1, position 1."]}得到这个
  • 也尝试按照第一点的建议创建一个请求对象,也许您的主体不是完全有效的 JSON?您可以在一些在线检查器中验证它以确保
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多