Feather Http API라고도 하는 Minimal APIs에 익숙해지기 위해 윗 글의 내용을 따라해보면서 감각을 익혀보려 합니다. 프로그래머는 역시 코딩으로 익숙해져야 하니까요.
처음 소식을 접했을 때 한참 학생들에게 파이썬의 Flask를 이용해 REST API를 구현하도록 하는 과정중에 있었는데, 유사한 코드량으로 이제 C#으로도 REST API를 만들 수 있어보여 인상깊었습니다.
따라 하는 과정은 댓글로 진행해보도록 하겠습니다.
Feather Http API라고도 하는 Minimal APIs에 익숙해지기 위해 윗 글의 내용을 따라해보면서 감각을 익혀보려 합니다. 프로그래머는 역시 코딩으로 익숙해져야 하니까요.
처음 소식을 접했을 때 한참 학생들에게 파이썬의 Flask를 이용해 REST API를 구현하도록 하는 과정중에 있었는데, 유사한 코드량으로 이제 C#으로도 REST API를 만들 수 있어보여 인상깊었습니다.
따라 하는 과정은 댓글로 진행해보도록 하겠습니다.
먼저 .NET 6 Preview 6 SDK를 설치해야 합니다.
그리고 Visual Studio 2019 Preview로 진행해보도록 합시다.
먼저 콘솔 어플리케이션 프로젝트를 생성한 후, csproj를 다음처럼 변경 합니다.
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
</PropertyGroup>
</Project>
웹 어플리케이션으로 프로젝트를 생성해도 되지만 투어에 불필요한 파일이 생성되므로 이렇게 진행을 하고 있습니다. 첫번째 예제를 실행해보겠습니다.
var app = WebApplication.Create(args);
app.MapGet("/", () => "Hello World!");
await app.RunAsync();
using도 없고 뭔가 이상하죠? C# 9에서는 아직은 동작하지 않는 코드입니다. 이것을 다음처럼 변경하겠습니다.
using System;
using Microsoft.AspNetCore.Builder;
var app = WebApplication.Create(args);
app.MapGet("/", (Func<string>)(() => "Hello World!"));
await app.RunAsync();
실행하면 다음처럼 잘 실행됩니다.

(Func<string>)으로의 명시적 캐스트는 C# 10의 Lambda improvements에 의해서 없어질 예정이라고 합니다. 그리고, global using을 통해 마치 Blazor의 _Imports.razor와 유사하게 사용 가능하게 될 예정이라고 합니다.
C# 10를 활성화 해보겠습니다. .NET 6 Preview 4 SDK가 설치되어 있어야 하고 Visual Studio 2019 Preview여야 합니다.
csproj파일에 <LangVersion>preview</LangVersion>을 추가 합니다.
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<LangVersion>preview</LangVersion>
</PropertyGroup>
</Project>
usings.cs파일을 만들고 다음처럼 합니다.
global using Microsoft.AspNetCore.Builder;
이제 기존 코드를 다음처럼 변경합니다.
var app = WebApplication.Create(args);
app.MapGet("/", () => "Hello World!");
await app.RunAsync();
^^;
usings.cs
global using System.Threading.Tasks;
global using Microsoft.AspNetCore.Builder;
global using System.Net.Http;
var app = WebApplication.Create(args);
app.MapGet("/quote", async () =>
await new HttpClient().GetStringAsync("https://ron-swanson-quotes.herokuapp.com/v2/quotes"));
await app.RunAsync();
var app = WebApplication.Create(args);
app.MapGet("/person", () => new Person("모이", "디"));
await app.RunAsync();
public record struct Person(string FirstName, string LastName);
var app = WebApplication.Create(args);
app.MapPost("/person", (Person p) => $"새로운 사람이 생겼습니다. : {p.LastName}{p.FirstName}");
await app.RunAsync();
public record struct Person(string FirstName, string LastName);
Windows 10 터미널에서 UTF-8을 원할하게 사용하려면, 다음의 설정을 체크해야 합니다.

슬로그를 마무리 하기 위해 간단히 코딩 해보겠습니다.
ConcurrentDictionary<string, string> dict = new(StringComparer.OrdinalIgnoreCase)
{
["Apple"] = "사과",
["Piano"] = "피아노"
};
var app = WebApplication.Create(args);
app.MapGet("/dict", () => dict);
app.MapPost("/dict", (Word word) => dict[word.Eng] = word.Kor);
app.MapGet("/dict/{eng}", (string eng) => new { Response = dict[eng] });
app.MapDelete("/dict/{eng}", (string eng) => dict.TryRemove(eng, out var _));
await app.RunAsync();
record Word(string Eng, string Kor);
