สร้าง .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 แล้ว

จบ

2 thoughts on “สร้าง .NET Core 2.0 Web API

Leave a Reply

Your email address will not be published. Required fields are marked *