สร้าง .NET Core 2.0 Web API

ลองสร้าง Web API ด้วย .NET Core 2.0 ดูบ้าง ตั้งโจทย์ง่าย ๆ ขึ้นมาคือ ทำ String Manipulation Service ผ่าน HTTP Protocol

กำหนดให้มี API Spec ของ Service เป็นแบบนี้

API: /api/concat
Method: POST
Request Body:

{
    "args": ["<string 1>", "<string 2>", "<string 3>", ...]
}

Response Body:

{
    "result": "<string 1><string 2><string 3>..."
}

เริ่มต้นจากสร้าง Web API project ใหม่ก่อน ด้วยคำสั่ง dotnet new

dotnet new webapi -o StringAPI

เสร็จแล้วเปิด editor ไปที่ StringAPI folder ที่เพิ่งสร้างขึ้นมา เปิดไปที่ Controllers/ValuesController.cs จะเห็นหน้าตาแบบนี้

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;

namespace StringAPI.Controllers
{
    [Route("api/[controller]")]
    public class ValuesController : Controller
    {
        // GET api/values
        [HttpGet]
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }

        // GET api/values/5
        [HttpGet("{id}")]
        public string Get(int id)
        {
            return "value";
        }

        // POST api/values
        [HttpPost]
        public void Post([FromBody]string value)
        {
        }

        // PUT api/values/5
        [HttpPut("{id}")]
        public void Put(int id, [FromBody]string value)
        {
        }

        // DELETE api/values/5
        [HttpDelete("{id}")]
        public void Delete(int id)
        {
        }
    }
}

จาก API Spec ตอนต้น เราอยากได้แค่ Post อย่างเดียว ผ่าน /api/concat ดังนั้นเราเปลี่ยนชื่อ controller เป็น ConcatController พร้อมเปลี่ยนชื่อไฟล์ รวมถึงให้ลบ method ที่ไม่ได้ใช้ออก ให้เหลือแค่นี้

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;

namespace StringAPI.Controllers
{
    [Route("api/[controller]")]
    public class ConcatController : Controller
    {
        [HttpPost]
        public void Post([FromBody]string value)
        {
        }
    }
}

เนื่องจาก Request body ของเราไม่ได้เป็น Plain String แต่เป็นโครงสร้างตามที่ประกาศไว้ใน API ดังนั้นเพื่อให้ง่าย เลยทำ Model มารับมันแทน

วิธีทำคือ สร้าง folder ใหม่ ชื่อว่า Models อยู่ภายใต้ project ของเรา ระดับเดียวกับ folder Controllers เสร็จแล้วสร้างไฟล์ใหม่ชื่อว่า ConcatArgsModel.cs มีของข้างในหน้าตาแบบนี้

namespace StringAPI.Models {
    public class ConcatArgs {
        public string[] Args { get; set; }
    }
}

เสร็จแล้วเราก็เอาไปใส่ใน Post method ที่เราเตรียมไว้ จะได้เป็นแบบนี้ (สังเกตว่าจะต้อง import ผ่าน using เข้ามาด้วย)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using StringAPI.Models;

namespace StringAPI.Controllers
{
    [Route("api/[controller]")]
    public class ConcatController : Controller
    {
        [HttpPost]
        public void Post([FromBody]ConcatArgs value)
        {
        }
    }
}

ที่เหลือที่จะต้องทำคือ เอา String ที่ส่งเข้ามา มาต่อกัน และ return ค่ากลับออกไป แต่ Post method ของเดิม มันบอกว่าไม่ได้ return อะไร (void) ดังนั้นเราก็แก้ให้เป็นให้มัน return JsonResult แทน เพื่อทำการ return JSON กลับออกไป

สุดท้ายเราจะได้ code ที่หน้าตาแบบนี้

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using StringAPI.Models;

namespace StringAPI.Controllers
{
    [Route("api/[controller]")]
    public class ConcatController : Controller
    {
        [HttpPost]
        public JsonResult Post([FromBody]ConcatArgs value)
        {
            var concat_result = String.Concat(value.Args);
            var response = new {
                result = concat_result
            };
            return Json(response);
        }
    }
}

ถ้าต้องการแก้ไข header ที่ return กลับออกไป ไม่ว่าจะเป็นแก้ status code หรือ header อื่น ๆ ให้ return IActionResult แทนที่จะ return JsonResult เช่น

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using StringAPI.Models;

namespace StringAPI.Controllers
{
    [Route("api/[controller]")]
    public class ConcatController : Controller
    {
        [HttpPost]
        public IActionResult Post([FromBody]ConcatArgs value)
        {
            var concat_result = String.Concat(value.Args);   
            var response = new {
                result = concat_result
            };
            return Ok(response);
        }
    }
}

ปิดท้ายด้วย ลองทดสอบ API ที่สร้างขึ้นมา

เริ่มจาก สั่ง start web api ก่อนด้วยคำสั่ง dotnet run

dotnet run

เสร็จแล้วลองทดสอบผ่าน Postman

ทุกอย่างดูโอเคเหมือนกับที่ประกาศใน API spec แล้ว

จบ

One thought on “สร้าง .NET Core 2.0 Web API

Leave a Reply