อยากเป็น Backend Developer หน่ะหรอ !! ก็ใช้ ASP.Net เลยสิ้

Siwatch Sritrakul
Sirisoft
Published in
7 min readJul 13, 2023

สวัสดีครับผมชื่อพูมนะครับ เป็น Software Developer ที่บริษัท Sirisoft ครับผม วันนี้ผมจะมานำเสนอวิธีการเขียน Backend Rest API ด้วย ASP.Net Framework หรือที่ทุกคนอาจจะเห็นหรือเคยได้ยินคำว่า “ .Net ” นั่นเองครับ

แล้วเจ้า ASP.Net มันดียังไงทำไมถึงได้รับความนิยมค่อนข้างมากในปัจจุบันนี้หล่ะมาดูจุดเด่นของเจ้า ASP.Net กันครับ ( จากประสบการณ์ของตัวผมเองแล้วกันนะครับ )

จุดเด่นของ ASP.Net

  • มี Library มากมายให้เลือกสรรเพื่อใช้ในการพัฒนา Web Application
  • รองรับการพัฒนา Web API ด้วยการใช้งาน HTTP Service และสามารถใช้งานร่วมกับ Database ได้หลาย ๆ เจ้าอีกด้วย เช่น MS SQL, Oracle Database, PostgreSQL เป็นต้น
  • รองรับการเขียน Web Application ในรูปแบบของ MVC ( Model-View-Controller )
  • รองรับการใช้งาน Cloud Service ของ Microsoft Azure และ Cloud ดัง ๆ อีกหลาย ๆ เจ้าอีกด้วยครับ

เป็นยังไงบ้างครับจุดเด่นของ ASP.Net สุดยอดไปเลยสินะครับ ทีนี้มาเข้าเนื้อหาหลักของเรากันดีกว่า โดยเนื้อหาที่ผมเตรียมให้ไว้ทุกคนจะประกอบไปด้วย

  • การเตรียม Project สำหรับการเขียน Web API ด้วย ASP.Net
  • การเชื่อมต่อ Database ด้วย Entity Framework Core
  • การเขียน Rest API Create-Read-Update-Delete ( CRUD )

เรามาเริ่มสร้าง Rest API ด้วยเจ้า ASP.Net กันเลยครับ !!

Prerequisite

  • พื้นฐานภาษา C# และ Object-Oriented-Programming
  • ASP.Net Core ( Version 6 ขึ้นไป )
  • IDE Visual Studio หรือ Text Editor ที่สามารติดตั้ง Extension สำหรับ ASP.Net ได้ครับ ( ผมเลือกใช้ VSCode ครับ )
  • Database ( ผมเลือกใช้ PostgreSQL ครับ )
  • Docker ( ใช้สำหรับสร้าง Container ของ PostgreSQL ครับ )
  • Swagger UI สำหรับทดสอบ Rest API

Installation

หลังจากติดตั้งเจ้า ASP.Net Core เรียบร้อยแล้วมาเริ่มสร้าง Project กันครับ โดยการสร้าง Project Web API โดยใช้คำสั่ง

dotnet new webapi -o services

ทำการเข้าถึง Folder ที่สร้างขึ้นมาโดยใช้ command และ list file ใน Project โดยในตัวอย่างจะใช้เป็น Command ของ Mac OS ครับ

cd services
ls
/* command ls เป็นคำสั่งที่ใช้ list ของที่อยู่ Directory ของเราครับ */
ตัวอย่าง Project ASP.Net Web API

จากนั้นทำการติดตั้ง Package สำหรับการใช้งาน Entity Framework Core ใน Folder Project ของเราโดยใช้คำสั่ง

dotnet add package Microsoft.EntityFrameworkCore --version 7.0.4
dotnet add package Microsoft.EntityFrameworkCore.Design --version 7.0.4
dotnet add package Microsoft.EntityFrameworkCore.Tools --version 7.0.4
dotnet add package Npgsql.EntityFrameworkCore.PostgreSQL --version 7.0.3

ต่อมาผมจะพามาสร้าง Class Model ที่จะให้เจ้า Entity Framework ไปทำการสร้าง Table ใน ​Database ให้เรากันครับ

ตัวอย่างของ Class Model

หลังจากทำการสร้าง Model แล้วต่อมาจะทำการเชื่อมต่อ Database กับตัว Web API กันด้วย Class ApplicationDbContext ครับ

ตัวอย่างของ Class ApplicationDbContext โดยผมได้ทำการสร้าง Function ที่จะให้ตัว EntityFramework ไปทำการสร้าง Database และ Table หากว่า Database หรือ Table ยังไม่ได้ถูกสร้างขึ้นมาครับ

จากนั้นผมจะพาไปทำการสร้าง ConnectionString สำหรับเชื่อมต่อ Application กับ Database กันครับ โดย Database ที่เลือกจะเป็น PostgreSQL ซึ่ง Database ในแต่ละเจ้าก็จะมี ConnectionString ที่แตกต่างกันครับ โดยเราจะทำการเขียนประกาศตัวแปรในการเก็บ ConnectionString เอาไว้ที่ไฟล์ Program.cs ครับผม

var host = "localhost";
var dbName = "MusicDB";
var port = "5432";
var user = "postgres";
var password = "admin1234";
var connectionString = $"Server={host}; Database={dbName};
Port={port}; UserId={user}; Password={password};";
builder.Services.AddDbContext<ApplicationDbContext>(options =>
options.UseNpgsql(connectionString)
);

โดยข้อดีของการสร้างตัวแปรเพื่อใช้ทำ ConnectionString แบบนี้คือในอนาคตเราสามารถแก้ไขตัวแปรเหล่านี้ให้เรียกใช้ค่าจาก Environment Variable ได้ครับทำให้ Application มีความหยืดหยุ่นในการแก้ไขในอนาคตครับ

โดยให้นำ Code ConnectionString ไปใส่ไว้ใน Program.cs ครับ ซึ่งไฟล์ Program จะถูกสร้างขึ้นมาจากขั้นตอนในการสร้าง Project ครับ

ตัวอย่าง Code การทำ Connection String ใน Program.cs บรรทัดที่ 15–20

จากนั้นเรามาทำการทดสอบการ Run Application ที่เราทำการ Setup ขึ้นมากันครับ โดยในการ Run Application ให้ใช้คำสั่ง

dotnet run --project services.csproj 

// หรือจะใช้คำสั่ง

dotnet watch --project services.csproj

โดยทั้งสองคำสั่งมีความแตกต่างกันอยู่นิดหน่อยครับ dotnet run หรือ dotnet watch จะเป็นคำสั่ง run ตัว application ขึ้นมาครับ เพียงแต่ว่า dotnet watch จะทำการ enable ตัว hot-reload ขึ้นมาในขณะที่ run application ด้วยครับ

ภาพตัวอย่าง Application ที่ Run ได้ถูกต้องโดยไม่มี Error เกิดขึ้น

Implement

หลังจาก Setup กันเสร็จผมจะพาทุกคนมาสร้าง API Service กันต่อเลยนะครับ

ขั้นตอนที่ 1 : สร้าง Interface มาเพื่อให้ Class MusicRepo ทำการ Implement IMusicRepo และเพื่อใช้ในการทำ Dependency Injection ครับ

ขั้นตอนที่ 2 : ทำการสร้าง Class Repository ขึ้นมา ในที่นี้จะตั้งชื่อว่า “ MusicRepo ” ซึ่งเจ้า Class MusicRepo เนี่ยจะใช้ในการติดต่อสื่อสารกับ Database ของเราครับผม

โดยใน Code นี้ได้ทำการฉีด Dependency หรือ Dependency Injection เพื่อทำการเรียกใช้ DbContext จาก Class ApplicationDbContext เข้ามาครับ

จากนั้นเราสร้าง Method ต่าง ๆ เพื่อใช้เรียกข้อมูลจาก Database กันเลยครับ

เริ่มจาก Method Get Music ครับเป็น Method ที่เรียกข้อมูลจาก Database ครับ เปรียบเสมือนการ Quey ข้อมูลจาก Database ครับผม

Method GetMusic จะทำการ Query ข้อมูลใน MusicsTable ด้วยและทำการเก็บเข้าตัวแปร musicList ด้วยการใช้ Method ToListAsync หากไม่มี Music ใน Database ค่าของตัวแปร musicList จะเป็น Null

public async Task<IEnumerable<Musics>> GetMusic()
{
try
{
List<Musics> musicList = await _dbContext.MusicsTable.ToListAsync();
return musicList;
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}

Method GetMusicById ครับเป็น Method ที่เรียกข้อมูลจาก Database โดยใช้ Id ของ music เพื่อที่จะ Query เฉพาะ Object ที่มี id ตรงกันจาก Database ครับ

Method GetMusicById — จะทำการ Query ข้อมูลใน MusicsTable โดยที่ Object ที่ได้จากการ Query นั้นจะต้องมี MusicId ที่ตรงกันกับ Parameter id และทำการเก็บ Object เข้าตัวแปร musicById หากไม่มี MusicId ที่ตรงกันค่าของตัวแปร musicById จะเป็น Null

public async Task<Musics> GetMusicById(int id)
{
try
{
Musics musicById = await _dbContext.MusicsTable.Where(music => music.MusicId == id)
.FirstOrDefaultAsync();
return musicById;
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}

Function Create และ Update Music ครับเป็น Function ที่ใช้สร้างหรืออัพเดทข้อมูลลง Database ครับ

Method CreateUpdateMusic — จะใช้สำหรับทำการสร้างหรือแก้ไขข้อมูลไปยัง Database โดยที่หากว่า MusicId นั้นมากกว่าศูนย์จะทำการ Update ข้อมูลใหม่ไปยัง Database แต่หากว่า MusicId น้อยกว่าหรือเท่ากับศูนย์จะทำการเพิ่มข้อมูลใหม่ไปยัง Database แทนครับและเมื่อมีการ Create หรือ Update ข้อมูลลง Database แล้วเราจะต้องทำการใช้งาน Method SaveChangeAsync ซึ่งจะเป็นการบันทึกการเปลี่ยนแปลงข้อมูล

public async Task<Musics> CreateUpdateMusic(Musics musicRequest)
{
try
{
if (musicRequest.MusicId > 0)
{
_dbContext.MusicsTable.Update(musicRequest);
}
else
{
_dbContext.MusicsTable.Add(musicRequest);
}
await _dbContext.SaveChangesAsync();
return musicRequest;
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}

และสุดท้าย Method Delete Music ครับ เป็น Method ที่ใช้ลบข้อมูลใน Database ครับผม

Method DeleteMusic — จะใช้สำหรับลบข้อมูลที่อยู่ใน MusicsTable โดยที่ข้อมูลที่จะถูกลบต้องมี MusicId ที่ตรงกันกับ Parameter id ของ Method DeleteMusic ครับโดยเราจะทำการ Query Object ที่มี MusicId ตรงกับ Parameter id แล้วทำการเช็ค Object ว่าต้องไม่มีค่าเป็น Null จึงจะสามารถทำการลบข้อมูลได้ด้วยการใช้งาน Method Remove และจากนั้นทำการใช้งาน Method SaveChangeAsync เพื่อทำการบันทึกการเปลี่ยนแปลงข้อมูล

public async Task<bool> DeleteMusic(int id)
{
try
{
Musics musicById = await _dbContext.MusicsTable
.FirstOrDefaultAsync(music => music.MusicId == id);
if (musicById == null)
{
return false;
}
_dbContext.Remove(musicById);
await _dbContext.SaveChangesAsync();
return true;
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
ตัวอย่าง Class MusicRepo ที่มีการสร้าง Function Create, Read, Update, Delete ครับ
builder.Services.AddScoped<IMusicRepo,MusicRepo>();

หลังจากสร้าง Class MusicRepo ให้นำ Code นี้ไปใช้ใน File Program.cs เพื่อทำการ Add Dependency

ตัวอย่าง Code การ Add Dependency บรรทัดที่ 26

ขั้นตอนที่ 3: มาทำการสร้าง Controller กันครับ

โดยเจ้าตัว Controller เนี่ยแหละครับที่ทำหน้าที่เสมือนเป็น API ของเราครับหรือจะเรียกได้ว่าเป็นส่วนที่สำคัญที่สุดในการทำ Rest API ของเจ้า ASP.Net ก็ว่าได้ครับ

ทำการสร้าง Class Controller โดยที่ Class Controller นี้จะต้องทำการ Dependency Injection Class MusicRepo เข้ามาใช้งาน

1.) สร้าง API ชื่อว่า getMusic เราสามารถตั้งชื่อ API ได้ผ่าน Route โดยการทำงานของ API getMusic จะเป็น API สำหรับดึงข้อมูล Music ทั้งหมดจาก Database

[HttpGet]
[Route("getMusic")]
public async Task<object> GetMusic()
{
try
{
IEnumerable<Musics> musics = await _musicRepo.GetMusic();
return Ok(musics);
}
catch (Exception ex)
{
throw ex;
}
}

2.) สร้าง API ชื่อว่า getMusicById และ API getMusicById จะมีการรับ Query Parameter id เราสามารถกำหนดการรับ Query Parameter ได้จากการใช้ “ {ตามด้วยชื่อ Parameter ที่ต้องการ} ” ได้ผ่าน Route ครับในที่นี้ผมตั้งชื่อ Query Parameter ว่า id โดยการทำงานของ API getMusicById จะเป็น API สำหรับดึงข้อมูล Music ที่มี Id ตรงกันจาก Database

[HttpGet]
[Route("getMusicById/{id}")]
public async Task<IActionResult> GetMusicById(int id)
{
try
{
Musics music = await _musicRepo.GetMusicById(id);
return Ok(music);
}
catch (Exception ex)
{
throw ex;
}
}

การที่ API ต้องทำการรับค่า Query Parameter เนื่องจากเราต้องการที่จะรับค่า Parameter {id} เพื่อที่จะนำ Parameter id ไปใช้ในการ Query ข้อมูลจาก Database ครับ

3.) สร้าง API ชื่อว่า createMusic โดยที่ API createMusic จะมีการรับ Request Body เพื่อที่จะรับ Request Body และนำเอา Request มาใช้ในการสร้างข้อมูลลงใน Database ด้วยการใช้ [FromBody] เพื่อทำการรับ Request Body มายัง API createMusic

[HttpPost]
[Route("createMusic")]
public async Task<object> CreateMusic([FromBody] Musics musicsRequest)
{
try
{
Musics music = await _musicRepo.CreateUpdateMusic(musicsRequest);
return Ok(music);
}
catch (Exception ex)
{
throw ex;
}

}

4.) สร้าง API ชื่อว่า updateMusic โดยที่ API updateMusic จะมีการรับ Request Body เพื่อที่จะรับ Request Body และนำเอา Request มาใช้ในการแก้ไขหรืออัพเดทข้อมูลลงใน Database ด้วยการใช้ [FromBody] เพื่อทำการรับ Request Body มายัง API updateMusic

[HttpPut]
[Route("updateMusic")]
public async Task<object> UpdateMusic([FromBody] Musics musicsRequest)
{
try
{
Musics music = await _musicRepo.CreateUpdateMusic(musicsRequest);
return Ok(music);
}
catch (Exception ex)
{
throw ex;
}
}

5.) สร้าง API ชื่อว่า deleteMusicById โดยที่ API deleteMusicById จะมีการรับ Query Parameter id เราสามารถกำหนดการรับ Query Parameter ได้จากการใช้ “ {ชื่อ Parameter ที่ต้องการ} ” ได้ผ่าน Route ครับ โดยการทำงานของ API deleteMusicById จะเป็น API สำหรับลบข้อมูล Music ที่มี Id ตรงกันจาก Database

[HttpDelete]
[Route("deleteMusicById/{id}")]
public async Task<object> DeleteMusicById(int id)
{
try
{
bool isSuccess = await _musicRepo.DeleteMusic(id);
return Ok(isSuccess);
}
catch (Exception ex)
{
throw ex;
}
}
ตัวอย่าง Code ใน Class MusicController

ขั้นตอนที่ 4 : ทำการรัน Database ขึ้นมาครับ ในที่นี้จะเลือกใช้เป็น Docker และ ทำการ Run PostgreSQL Image ครับ โดยทำการใช้คำสั่งต่อไปนี้

docker run --name postgres_container -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=admin1234 -p 5432:5432 -d postgres

คำสั่งนี้จะเป็นการสร้าง container และทำการ run image ของ postgreSQL ขึ้นมาผ่านตัว Docker ครับ สามารถตรวจสอบว่า status container ของ postgres ที่รันขึ้นมาได้ผ่าน docker gui หรือสามารถคำสั่ง docker ps

จะเห็นว่าเจ้า Container ชื่อ postgres_container ถูกรันขึ้นทีนี้เราก็สามารถใช้งาน Postgres Database บนเครื่อง local ของเราได้แล้วครับ

ขั้นตอนที่ 5 : ทำการรัน Web API Application ขึ้นมาครับ

ในขั้นตอนนี้เราจะมาทำการทดสอบ API ที่เราได้เตรียมไว้จากหัวข้อที่ผ่าน Swagger UI ครับก่อนอื่นให้ทำรัน Web API Application ที่เราได้ทำการเตรียมไว้จากหัวข้อที่ผ่าน ๆ โดยใช้คำสั่ง

dotnet watch --project services.csproj

หลังจากใช้คำสั่งรัน Application แล้วเจ้า .Net จะทำการ Compile โค้ดต่าง ๆ และทำการเปิดหน้า Swagger มาให้โดยอัตโนมัติครับหรือเราสามารถเข้าหน้า Swagger ได้ผ่านทาง URL — “http://localhost:5062/swagger/index.html โดย port ที่ตัว Application Run อยู่สามารถทำการเปลี่ยนและแก้ไขได้ในไฟล์ “launchSettings.json” ซึ่งอยู่ใน Folder Properties ที่ได้มาจากการสร้าง Project ครับ

รูปตัวอย่าง URL ที่ตัว Application ทำการ Generate ขึ้นมาในไฟล์ launchSettings.json ที่อยู่ใน Folder Properties ที่ถูกสร้างขึ้นในตอนสร้าง Project

หลังจากที่ Application ทำการเปิดหน้า Swagger UI แล้วจะได้ Document หน้าตาแบบนี้ครับผมโดยที่ Swagger UI มันเปรียบได้กับเอกสารคู่มือในการใช้งาน API ครับ

ตัวอย่าง Swagger UI จะแสดง API ที่เราได้เตรียมเอาไว้โดยจะ Detect API จาก Http Action ที่อยู่ใน Controller ครับ

ถัดไปผมจะขอทำการยกตัวอย่างการใช้งาน API ด้วย API createMusic และ API getMusic นะครับ

ตัวอย่างการใช้งาน API createMusic ครับ
ตัวอย่างการใช้งาน API createMusic ครับ
ตัวอย่าง Response ของ API createMusic ครับ

หลังจากใช้ API createMusic ในการสร้างเพลงแล้วเราสามารถทำการเช็คข้อมูลจาก Database โดยใช้ API getMusicได้ครับ

ตัวอย่างการใช้งาน API Get ครับ โดย API getMusic จะทำการเรียกดูข้อมูลจากระบบ Database Postgres ที่ Table Music ออกมาครับ

ก็จะเห็นได้ว่า API ที่เราได้ทำการเขียนขึ้นมานั้นสามารถทำงานได้ปกติครับ โดยทุกคนสามารถทดสอบการใช้งาน API ต่าง ๆ ผ่าน Swagger UI ได้เลยครับ

หวังว่า Blog ของผมจะเป็นประโยชน์ให้กับคนที่กำลังสนใจอยากจะลองมาเป็น Backend Developer หรือ คนที่กำลังศึกษาเจ้า ASP.Net นะครับผมโดยทุกคนสามารถเข้าไปศึกษาเพิ่มเติมจากเอกสารของทาง Microsoft ได้จากลิงก์นี้นะครับ

“Every next level of your life will demand a different you.”
– Leonardo DiCaprio –

สามารถติดตามบทความและข่าวสารอื่น ๆ ได้ผ่านทาง
Medium : https://medium.com/sirisoft
Facebook : https://www.facebook.com/sirisoft
Instagram : https://www.instagram.com/sirisoft_official
Tiktok : www.tiktok.com/@sirisoft_official
Youtube : https://www.youtube.com/@sirisoftofficial1698

และเพื่อน ๆ คนไหนสนใจอยากจะมาร่วม Dev กับพวกเราก็สามารถต่อติดสอบถามหรือสมัครได้ผ่านทาง HR ทางช่องทางติดต่อ
Line : https://lin.ee/1eqbK9V
Email : Jobs@sirisoft.co.th

--

--