2017-05-30 3 views
0

Ich versuche, ein Adressobjekt in einer Datenbank über eine asp.net Core API zu erstellen. Ich benutze Postman, um die Methode aufzurufen.asp.net Kern Api - neue Zeile in Datenbank einfügen

Klasse:

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 (mit POST):

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

Ich habe auch einen Haltepunkt in der Methode, aber es trifft nie. Ich bekomme keine Fehlermeldung, es tut einfach nichts.

+0

kann Sie zeigen die Ansicht? –

+0

Sehen Sie sich die [URL-Codierung] (https://www.google.nl/search?q=URL+encoding) Werte an. Ein @ -Zeichen ist in einer URL nicht gültig. Verwenden Sie% 40, Ihnen geht es gut. –

+0

Warum das Objekt 'Adresse' nicht übergeben? – Izzy

Antwort

3

Sie @Rick van den Bosch Kommentar sehen können, aber nach wie vor möchten Sie die Route mit der Aktion angeben. Verwenden Sie diese

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

Sie verwenden POST nicht korrekt.

Wenn Sie POST verwenden, sollten Sie keine Parameter über die Abfragezeichenfolge senden, Sie sollten den Anfragetext verwenden. Wenn Sie sie dennoch über die Abfragezeichenfolge senden müssen, sollten Sie das Attribut FromQuery in Ihren Aktionsparametern verwenden.

[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); 
} 

bearbeiten: Verwenden Sie [Route("api/[controller]/[action]")] den Aktionsnamen in Ihrer Aktion Route anzuhängen.

+0

POST ist * nicht * erforderlich, um den HTTP-Körper nur zur Kommunikation von Daten zu verwenden . Genauso wie Sie den Rest der URL verwenden, können Sie jederzeit Abfrageargumente für jede HTTP-Methode verwenden. Allerdings wird der Endpunkt laut den Kommentaren nicht gefunden, daher wird Ihr Vorschlag hier nicht helfen. – poke

+0

@poke Es ist nicht erforderlich, aber es ist keine Konvention. Wenn ein Kunde oder Entwickler diese API implementieren muss, sieht es nicht so aus, als würde man POST verwenden, sondern Parameter über eine Abfragezeichenfolge senden. – jorgonor

1

Siehe @Ayvaras Kommentar. Da Sie einen Web-API-Controller erstellen, müssen Sie den Aktionsnamen in Ihrer URL nicht angeben. Der HttpPost verweist alle POST-Aktionen auf die CreateAddress-Methode an den Mailer-Controller.

Ihr sollte POST URL sein:

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

Problem gelöst! Dank Ayvaras,

[Weg ("api/[controller]/[Aktion]")]

hat den Trick. Nun, da die Methode gefunden wird, ich sehe in kann, wie ein Objekt zu übergeben statt mit Abfragezeichen

0

Statt den Controller Routing-Schema zu ändern, ist es auch möglich, den Endpunkt Namen angeben, indem Sie die folgenden

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