Erick Kurniawan

Microsoft Certified Trainer, Microsoft MVP for +15y on Developer Technologies

ASP.NET Core Minimal API Parameter Binding

Tutorial ini adalah lanjutan dari tutorial sebelumnya tentang pengenalan Minimal API pada ASP.NET Core. Pada tutorial kali ini akan dibahas bagaimana menggunakan parameter binding pada ASP.NET Minimal API pada .NET 8.

Parameter binding adalah proses mengubah data yang dikirimkan pada proses request menjadi parameter pada method yang ada di Minimal API. Ada beberapa tipe Minimal API yaitu:

– Route Values
– Query String
– Header
– Body (JSON)
– Form values
– Services yang disediakan oleh DI
– Custom

Penggunaan Parameter Binding

Berikut adalah contoh penggunaan parameter binding pada method GET di Minimal API.

app.MapGet("/{id}", (int id,
                     int page,
                     [FromHeader(Name = "X-CUSTOM-HEADER")] string customHeader,
                     Service service) => { });

Kode diatas menunjukan penggunaan beberapa contoh parameter yaitu:
-Id: route value (akan mengambil dari url segment)
-page: query string (akan mengambil nilai dari query string pada url ?page=<nilai>)
-customHeader: header
service: Ini digunakan untuk menambahkan DI (dependency injection)

Explicit Parameter Binding

Selain cara penulisan seperti contoh diatas, kita juga dapat menuliskan parameter binding secara eksplisit dengan menambahkan jenis bindingnya. Contoh penulisannya dapat dilihat pada contoh berikut:

app.MapGet("/{id}", ([FromRoute] int id,
                     [FromQuery(Name = "p")] int page,
                     [FromServices] Service service,
                     [FromHeader(Name = "Content-Type")] string contentType) 
                     => {});

Mengambil Nilai dari Parameter bertipe Object

Cara yang paling mudah untuk mengambil data dari parameter adalah menggunakan object, anda dapat menuliskannya menggunakan [AsParameters] atau implicit tanpa attribut. Contoh penulisannya sebagai berikut:

app.MapPost("/ap/todos", async ([AsParameters] NewTodoRequest request) =>
{
    var todo = new Todo
    {
        Name = request.Name,
        Visibility = request.Visibility
    };

   -------

    return Results.Ok();
});

Selain menggunakan object sebagai parameter, anda juga dapat menggunakan [FromForm], berikut contoh penulisannya:

app.MapPost("/todos", async ([FromForm] string name,
    [FromForm] Visibility visibility) =>
{
    var todo = new Todo
    {
        Name = name,
        Visibility = visibility
    };
   -----------
});

Penambahan Dependency Injection pada parameter

Berikut contoh untuk menuliskan parameter binding berupa dependency injection.

builder.Services.AddSingleton<IDateTime, SystemDateTime>();
-------------------
app.MapGet("/",   (               IDateTime dateTime) => dateTime.Now);
app.MapGet("/fs", ([FromServices] IDateTime dateTime) => dateTime.Now);

Optional Parameter

Semua parameter yang ada pada Minimal APi harus ada isinya, jika tidak maka akan melempar eksepsi kesalahan. Jika parameter belum pasti akan ada isinya maka dapat digunakan optional parameter. Cara penulisan optional parameter pada Minimal API adalah sebagai berikut:

app.MapGet("/products", (int? pageNumber) => $"Requesting page {pageNumber ?? 1}");

string ListProducts(int pageNumber = 1) => $"Requesting page {pageNumber}";

File Upload menggunakan IFormFile dan IFormFileCollection

Berikut adalah contoh parameter yang dapat digunakan untuk upload file.

app.MapPost("/upload", async (IFormFile file) =>
{
    var tempFile = Path.GetTempFileName();
    app.Logger.LogInformation(tempFile);
    using var stream = File.OpenWrite(tempFile);
    await file.CopyToAsync(stream);
});

Untuk upload multiple file gunakan cara berikut:

app.MapPost("/upload_many", async (IFormFileCollection myFiles) =>
{
    foreach (var file in myFiles)
    {
        var tempFile = Path.GetTempFileName();
        app.Logger.LogInformation(tempFile);
        using var stream = File.OpenWrite(tempFile);
        await file.CopyToAsync(stream);
    }
});

Published by

Leave a comment