2017-05-30 58 views
0

我想通过一个asp.net核心api在数据库中创建一个地址对象。我使用Postman来调用该方法。asp.net核心Api - 在数据库中插入新行

类:

namespace LC.Tools.API.Controllers { 
    [Route("api/[controller]")] 
    public class MailerController : Controller 
    { 
     Data.LCToolsDbContext _context; 

     public MailerController(Data.LCToolsDbContext context) 
     { 
      _context = context; 
     } 

     [HttpPost] 
     public async Task<IActionResult> CreateAddress(int client, string name, string email) 
     { 
      Address adr = new Address() { ClientId = client, Name = name, Email = email }; 
      _context.MailerAddresses.Add(adr); 
      await _context.SaveChangesAsync(); 

      return Ok(adr); 
     } 
    } } 

URL(使用POST):

http://localhost:50444/api/mailer/createAddress?client=1&name=test&[email protected] 

我也有方法的破发点,但它从来没有击中。我没有收到任何错误消息,它只是没有做任何事情。

+0

指定端点名称可以你展示视图? –

+0

查看[URL编码](https://www.google.nl/search?q=URL+encoding)您的值。 @符号在URL中无效。使用%40,你会没事的。 –

+0

为什么不传入'address'对象? – Izzy

回答

3

你可以看到@Rick范登博世的评论,但仍然要指定用行动路线。使用这个

[Route("api/[controller]/[action]")] 
0

您没有正确使用POST。

如果使用POST,则不应通过查询字符串发送参数,而应使用请求主体。即使如果您仍然需要通过查询字符串发送它们,您应该在您的操作参数中使用FromQuery属性。

[HttpPost] 
public async Task<IActionResult> CreateAddress([FromQuery] int client, [FromQuery] string name, [FromQuery] string email) 
{ 
    Address adr = new Address() { ClientId = client, Name = name, Email = email }; 
    _context.MailerAddresses.Add(adr); 
    await _context.SaveChangesAsync(); 

    return Ok(adr); 
} 

编辑:使用[Route("api/[controller]/[action]")]在你的行动路线附加动作名称。

+0

POST不*仅用于传输数据。就像您使用URL的其余部分一样,您可以随时使用查询参数,适用于任何HTTP方法。这就是说,根据评论,端点没有找到,所以你的建议在这里没有帮助。 – poke

+0

@poke这不是必需的,但它不是一个约定。如果客户或开发人员必须实现这个API,它看起来不像通常那样使用POST,而是通过查询字符串发送参数。 – jorgonor

1

查看@Ayvaras的评论。由于您正在构建Web API控制器,因此不必在URL中指定操作名称。 HttpPost将所有POST操作指向邮件控制器,并指向CreateAddress方法。

您的文章网址应该是:

http://localhost:50444/api/mailer?client=1&name=test&[email protected] 
1

问题解决!感谢Ayvaras,

〔路线( “API/[控制器]/[动作]”)]

确实起作用。现在,该方法被发现我可以看看如何传递的对象,而不是使用查询字符串

0

而不是改变控制器路由方案,它也可以通过执行以下操作

[HttpPost("createAddress")] 
public async Task<IActionResult> CreateAddress(int client, string name, string email) 
{ 
    [...] 
}