ASP.NET Core – Erhalten Sie gepostete Formulardaten in einem API-Controller

 C Programming >> C-Programmierung >  >> Tags >> API
ASP.NET Core – Erhalten Sie gepostete Formulardaten in einem API-Controller

Um gepostete Formulardaten in einem API-Controller (mithilfe des [ApiController]-Attributs) in ASP.NET Core abzurufen, verwenden Sie Parameter mit dem [FromForm]-Attribut.

[Route("api/[controller]")]
[ApiController]
public class LocationController : ControllerBase
{
	[HttpPost]
	public IActionResult Post([FromForm] string location)
	{
		//process the form data
		
		return Ok(location);
	}
}
Code language: C# (cs)

Eine Anfrage an diesen Endpunkt würde wie folgt aussehen:

POST /api/weather HTTP/1.1
Content-Type: application/x-www-form-urlencoded

location=United+StatesCode language: plaintext (plaintext)

Die Formulardaten sind eine Zeichenfolge aus Schlüsselwertpaaren (z. B.:location=United+States ). Das Framework versucht, die Formulardaten Parametern zuzuordnen, indem es die Formularschlüssel mit Parameternamen (oder Modelleigenschaftsnamen) abgleicht.

Sie können mehrere Formularfelder als einzelne Parameter zuordnen, einem Modell zuordnen und die Formulardaten auch direkt lesen, wenn Sie möchten. In diesem Artikel zeige ich Beispiele für jedes dieser Szenarien.

Mehrere Formularfelder als einzelne Parameter zuordnen

Nehmen wir an, Ihr Formular hat zwei Felder:Standort und Temperatur. Sie können diese Felder als einzelne Parameter zuordnen:

[Route("api/[controller]")]
[ApiController]
public class WeatherController : ControllerBase
{
	[HttpPost]
	public IActionResult Post([FromForm] string location, [FromForm] int temperature)
	{
		//process the parameters
		
		return Ok($"{location} {temperature}");
	}
}
Code language: C# (cs)

So würde eine Anfrage an diesen Endpunkt aussehen:

POST /api/weather HTTP/1.1
Content-Type: application/x-www-form-urlencoded

location=United+States&temperature=64Code language: plaintext (plaintext)

Hinweis:Wenn mehrere Formularfelder vorhanden sind, werden die Schlüssel-Wert-Paare durch ein kaufmännisches Und (&) getrennt.

Zuordnung zu einem Modell

Anstatt Formularfelder als einzelne Parameter zuzuordnen, können Sie sie einem Modell zuordnen. Dies ist eine gute Option, da sie die Modellvalidierung durchführt.

[Route("api/[controller]")]
[ApiController]
public class WeatherController : ControllerBase
{
	[HttpPost]
	public IActionResult Post([FromForm] Weather weather)
	{
		SaveToDatabase(weather);

		return Ok();
	}
	
	//rest of class
}
Code language: C# (cs)

Dadurch werden die Formulardaten der Wetterklasse zugeordnet, die die folgende Definition hat:

using System.ComponentModel.DataAnnotations;

public class Weather
{
	[Required]
	public string Location { get; set; }

	public string Description { get; set; }

	[Required]
	[Range(-200, 200)]
	public int Temperature { get; set; }
}
Code language: C# (cs)

Anfragen an diesen Endpunkt würden wie folgt aussehen:

POST /api/weather HTTP/1.1
Content-Type: application/x-www-form-urlencoded

location=United+States&temperature=64&description=cloudyCode language: plaintext (plaintext)

Bei der Zuordnung zu einem Modell werden Formularschlüssel mit Modelleigenschaftennamen abgeglichen. Wie Sie sehen können, wird ein Vergleich ohne Berücksichtigung der Groß-/Kleinschreibung durchgeführt (location stimmt mit Wetter.Ort überein ).

Mapping-Validierungsfehler

Wenn es Formulardaten Parametern zuordnet, führt es eine Validierung durch und gibt die Fehlerantwort 400 – Bad Request zurück wenn es ein Problem gibt.

Wenn beispielsweise ein Typ nicht übereinstimmt, erhalten Sie eine Fehlermeldung wie diese:

{
    "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
    "title": "One or more validation errors occurred.",
    "status": 400,
    "traceId": "00-64ab197a56446c448095e9d3c3082c8b-a4255f612fce2e49-00",
    "errors": {
        "Temperature": [
            "The value 'text' is not valid for Temperature."
        ]
    }
}
Code language: JSON / JSON with Comments (json)

Wenn Sie ein Modell zuordnen, wird es auch anhand der System.ComponentModel.DataAttributions-Attribute validiert.

Beispielsweise hat Weather.Location das Attribut [Erforderlich]. Wenn eine erforderliche Eigenschaft in den Formulardaten fehlt, erhalten Sie eine Fehlermeldung wie diese:

{
    "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
    "title": "One or more validation errors occurred.",
    "status": 400,
    "traceId": "00-d37111fc22168f42b5cbe4684eea9359-7a98c6fa7d623b4e-00",
    "errors": {
        "Location": [
            "The Location field is required."
        ]
    }
}Code language: JSON / JSON with Comments (json)

Fehlerantwort 415 – Medientyp nicht unterstützt

Wenn Sie versuchen, ein Modell zuzuordnen und das Attribut [FromForm] nicht einzuschließen, wie hier:

[HttpPost]
public IActionResult Post(Weather weather)
Code language: C# (cs)

Dann erhalten Sie die Fehlerantwort 415 – Unsupported Media Type .

{
    "type": "https://tools.ietf.org/html/rfc7231#section-6.5.13",
    "title": "Unsupported Media Type",
    "status": 415,
    "traceId": "00-cac8e6fd75525e40b3e2b61e0bc2008a-725c6cba45bde44d-00"
}
Code language: JSON / JSON with Comments (json)

Dies kann behoben werden, indem das Attribut [FromForm] hinzugefügt wird:

[HttpPost]
public IActionResult Post([FromForm] Weather weather)
Code language: C# (cs)

Formulardaten ohne Mapping lesen

Es kann Szenarien geben, in denen Sie die Formulardaten lesen möchten, ohne dass das Framework sie für Sie zuordnet.

Sie können die Formulardaten direkt aus HttpContext.Request.Form:

lesen
[HttpPost]
public IActionResult Post()
{
	foreach(var key in HttpContext.Request.Form.Keys)
	{
		var val = HttpContext.Request.Form[key];

		//process the form data
	}
	
	return Ok();
}
Code language: C# (cs)