แบบฝึกหัด - เพิ่มตัวควบคุม

เสร็จสมบูรณ์เมื่อ

ตัวควบคุม เป็นคลาสสาธารณะที่มีวิธีการสาธารณะอย่างน้อยหนึ่งวิธีที่เรียกว่าการดําเนินการ ตามแบบแผน ผู้ควบคุมจะถูกวางใน Controllers ของ project root ไดเรกทอรี การดําเนินการจะแสดงเป็นจุดสิ้นสุด HTTP ภายในตัวควบคุม API เว็บ

สร้างตัวควบคุม

  1. เลือกโฟลเดอร์ Controllers ใน Visual Studio Code และเพิ่มไฟล์ใหม่ที่เรียกว่า PizzaController.cs

    สกรีนช็อตของ Visual Studio Code ที่แสดงการเพิ่มไฟล์ใหม่ไปยังโฟลเดอร์ผู้ควบคุม

    ไฟล์คลาสว่างที่ชื่อว่า PizzaController.cs จะถูกสร้างขึ้นใน Controllers ไดเรกทอรี Controllers ชื่อไดเรกทอรีเป็นแบบแผน ชื่อไดเรกทอรีมาจากตัวควบคุมแบบจําลอง- มุมมอง สถาปัตยกรรมที่ API เว็บใช้

    โน้ต

    ตามแบบแผน ชื่อคลาสผู้ควบคุมจะถูกต่อท้ายด้วย Controller

  2. เพิ่มโค้ดต่อไปนี้ลงใน Controllers/PizzaController.cs บันทึกการเปลี่ยนแปลงของคุณ

    using ContosoPizza.Models;
    using ContosoPizza.Services;
    using Microsoft.AspNetCore.Mvc;
    
    namespace ContosoPizza.Controllers;
    
    [ApiController]
    [Route("[controller]")]
    public class PizzaController : ControllerBase
    {
        public PizzaController()
        {
        }
    
        // GET all action
    
        // GET by Id action
    
        // POST action
    
        // PUT action
    
        // DELETE action
    }
    

    ตามที่คุณได้เรียนรู้ก่อนหน้านี้ คลาสนี้มาจาก ControllerBaseคลาสพื้นฐานสําหรับการทํางานกับคําขอ HTTP ใน ASP.NET Core นอกจากนี้ยังมีแอตทริบิวต์มาตรฐานสองอย่างที่คุณเรียนรู้เกี่ยวกับ: [ApiController] และ [Route] เช่นเดียวกับก่อนหน้านี้ แอตทริบิวต์ [Route] กําหนดการแมปไปยังโทเค็น [controller] เนื่องจากคลาสตัวควบคุมนี้มีชื่อว่า PizzaControllerตัวควบคุมนี้จึงจัดการการร้องขอไปยัง https://localhost:{PORT}/pizza

รับพิซซ่าทั้งหมด

คํากริยา REST แรกที่คุณต้องใช้คือ GETซึ่งลูกค้าสามารถรับพิซซ่าทั้งหมดจาก API ได้ คุณสามารถใช้แอตทริบิวต์ [HttpGet] ที่มีอยู่ภายในเพื่อกําหนดวิธีการที่ส่งกลับพิซซ่าจากบริการของเรา

แทนที่ข้อคิดเห็นของ // GET all action ใน Controllers/PizzaController.cs ด้วยโค้ดต่อไปนี้:

[HttpGet]
public ActionResult<List<Pizza>> GetAll() =>
    PizzaService.GetAll();

การดําเนินการก่อนหน้า:

  • ตอบสนองเฉพาะคํากริยา GET HTTP ตามที่ระบุโดยแอตทริบิวต์ [HttpGet]
  • แสดงอินสแตนซ์ ActionResult ของชนิด List<Pizza> ชนิด ActionResult คือระดับชั้นพื้นฐานสําหรับผลลัพธ์การดําเนินการทั้งหมดใน ASP.NET Core
  • คิวรีบริการสําหรับพิซซ่าทั้งหมดและส่งกลับข้อมูลด้วยค่า Content-Type ของ application/jsonโดยอัตโนมัติ

เรียกใช้พิซซ่าตัวเดียว

ลูกค้าอาจต้องการขอข้อมูลเกี่ยวกับพิซซ่าเฉพาะแทนที่จะเป็นรายการทั้งหมด คุณสามารถใช้การดําเนินการ GET อื่นที่จําเป็นต้องใช้พารามิเตอร์ id คุณสามารถใช้แอตทริบิวต์ [HttpGet("{id}")] ที่มีอยู่ภายในเพื่อกําหนดวิธีการที่ส่งกลับพิซซ่าจากบริการของเรา ตรรกะสายงานการผลิตจะลงทะเบียน [HttpGet] (โดยไม่มี id) และ [HttpGet("{id}")] (พร้อม id) เป็นสองเส้นทางที่แตกต่างกัน จากนั้นคุณสามารถเขียนการดําเนินการแยกต่างหากเพื่อดึงข้อมูลรายการเดียวได้

แทนที่ข้อคิดเห็นของ // GET by Id action ใน Controllers/PizzaController.cs ด้วยโค้ดต่อไปนี้:

[HttpGet("{id}")]
public ActionResult<Pizza> Get(int id)
{
    var pizza = PizzaService.Get(id);

    if(pizza == null)
        return NotFound();

    return pizza;
}

การดําเนินการก่อนหน้า:

  • ตอบสนองเฉพาะคํากริยา GET HTTP ตามที่ระบุโดยแอตทริบิวต์ [HttpGet]
  • กําหนดให้ค่าของพารามิเตอร์ id รวมอยู่ในเซกเมนต์ URL หลังจาก pizza/ โปรดจําไว้ว่า แอตทริบิวต์ [Route] ระดับตัวควบคุมที่กําหนดรูปแบบ /pizza
  • คิวรีฐานข้อมูลสําหรับพิซซ่าที่ตรงกับพารามิเตอร์ id ที่ระบุ

แต่ละอินสแตนซ์ ActionResult ที่ใช้ในการดําเนินการก่อนหน้าจะถูกแมปกับรหัสสถานะ HTTP ที่สอดคล้องกันในตารางต่อไปนี้:

ASP.NET Core
ผลลัพธ์การดําเนินการ
รหัสสถานะ HTTP คำอธิบาย
Ok โดยนัย 200 ผลิตภัณฑ์ที่ตรงกับพารามิเตอร์ id ที่ระบุมีอยู่ในแคชในหน่วยความจํา
ผลิตภัณฑ์จะรวมอยู่ในเนื้อความการตอบสนองในชนิดของสื่อ ตามที่กําหนดไว้ใน accept HTTP request header (JSON ตามค่าเริ่มต้น)
NotFound 404 ผลิตภัณฑ์ที่ตรงกับพารามิเตอร์ id ที่ระบุไม่มีอยู่ในแคชในหน่วยความจํา

สร้างและเรียกใช้ตัวควบคุมใหม่

สร้างและเริ่มต้น API เว็บโดยการเรียกใช้คําสั่งต่อไปนี้:

dotnet run

ทดสอบตัวควบคุมด้วยไฟล์ Http

  1. เปิด ContosoPizza.http

  2. เพิ่ม GET ใหม่เพื่อเรียกใช้จุดสิ้นสุด Pizza ภายใต้ตัวคั่น ###:

    GET {{ContosoPizza_HostAddress}}/pizza/
    Accept: application/json
    
    ###
    
  3. เลือกคําสั่ง ส่งคําขอ ด้านบนการโทร GET ใหม่นี้

    คําสั่งก่อนหน้าส่งกลับรายการของพิซซ่าทั้งหมดใน JSON:

    HTTP/1.1 200 OK
    Connection: close
    Content-Type: application/json; charset=utf-8
    Date: Wed, 17 Jan 2024 16:57:09 GMT
    Server: Kestrel
    Transfer-Encoding: chunked
    
    [
        {
            "id": 1,
            "name": "Classic Italian",
            "isGlutenFree": false
        },
        {
            "id": 2,
            "name": "Veggie",
            "isGlutenFree": true
        }
    ]   
    
  4. ในการคิวรีสําหรับพิซซ่าหนึ่งรายการ คุณสามารถส่งคําขอ GET อื่นได้ แต่ส่งผ่านพารามิเตอร์ id โดยใช้คําสั่งต่อไปนี้:

    GET {{ContosoPizza_HostAddress}}/pizza/1
    Accept: application/json
    
    ###
    

    คําสั่งก่อนหน้าส่งกลับ Classic Italian ด้วยผลลัพธ์ต่อไปนี้:

    HTTP/1.1 200 OK
    Content-Type: application/json; charset=utf-8
    Date: Fri, 02 Apr 2021 21:57:57 GMT
    Server: Kestrel
    Transfer-Encoding: chunked
    
    {
        "id": 1,
        "name": "Classic Italian",
        "isGlutenFree": false
    }
    
  5. API ของเรายังจัดการสถานการณ์ที่ไม่มีรายการอยู่ เรียกใช้ API อีกครั้ง แต่ส่งผ่านในพารามิเตอร์พิซซ่า id ที่ไม่ถูกต้องโดยใช้คําสั่งต่อไปนี้:

    GET {{ContosoPizza_HostAddress}}/pizza/5
    Accept: application/json
    
    ###
    

    คําสั่งก่อนหน้าส่งกลับข้อผิดพลาด 404 Not Found กับผลลัพธ์ต่อไปนี้:

    HTTP/1.1 404 Not Found
    Content-Type: application/problem+json; charset=utf-8
    Date: Fri, 02 Apr 2021 22:03:06 GMT
    Server: Kestrel
    Transfer-Encoding: chunked
    
    {
        "type": "https://tools.ietf.org/html/rfc7231#section-6.5.4",
        "title": "Not Found",
        "status": 404,
        "traceId": "00-ec263e401ec554b6a2f3e216a1d1fac5-4b40b8023d56762c-00"
    }
    

หลังจากที่คุณดําเนินการคํากริยา GET เสร็จสิ้นแล้ว ในหน่วยถัดไป คุณสามารถเพิ่มการดําเนินการเพิ่มเติมไปยัง PizzaController เพื่อสนับสนุนการดําเนินการ CRUD ในข้อมูลพิซซ่า

ตัวเลือก: ทดสอบตัวควบคุมด้วย Command Line HTTP Read-Eval-Print Loop (REPL)

  1. เปิดเทอร์มินัล httprepl ที่มีอยู่ หรือเปิดเทอร์มินัลรวมใหม่จาก Visual Studio Code โดยการเลือก Terminal> เทอร์มินัลใหม่จากเมนูหลัก

  2. เชื่อมต่อกับ API เว็บของเรา โดยการเรียกใช้คําสั่งต่อไปนี้:

    httprepl https://localhost:{PORT}
    

    อีกวิธีหนึ่งคือ เรียกใช้คําสั่งต่อไปนี้ตลอดเวลาในขณะที่ HttpRepl กําลังทํางาน:

    connect https://localhost:{PORT}
    
  3. หากต้องการดูจุดสิ้นสุด Pizza ที่พร้อมใช้งานใหม่ ให้เรียกใช้คําสั่งต่อไปนี้:

    ls
    

    คําสั่งก่อนหน้าตรวจพบ API ทั้งหมดที่พร้อมใช้งานบนจุดสิ้นสุดการเชื่อมต่อ ซึ่งควรแสดงโค้ดต่อไปนี้:

     https://localhost:{PORT}/> ls
     .                 []
     Pizza             [GET]
     WeatherForecast   [GET]
    
  4. ไปที่จุดสิ้นสุด Pizza โดยการเรียกใช้คําสั่งต่อไปนี้:

    cd Pizza
    

    คําสั่งก่อนหน้าแสดงผลลัพธ์ของ API ที่พร้อมใช้งานสําหรับจุดสิ้นสุดการ Pizza:

    https://localhost:{PORT}/> cd Pizza
    /Pizza    [GET]
    
  5. ทําการร้องขอ GET ใน HttpRepl โดยใช้คําสั่งต่อไปนี้:

    get
    

    คําสั่งก่อนหน้าส่งกลับรายการของพิซซ่าทั้งหมดใน JSON:

      HTTP/1.1 200 OK
      Content-Type: application/json; charset=utf-8
      Date: Fri, 02 Apr 2021 21:55:53 GMT
      Server: Kestrel
      Transfer-Encoding: chunked
    
      [
          {
              "id": 1,
              "name": "Classic Italian",
              "isGlutenFree": false
          },
          {
              "id": 2,
              "name": "Veggie",
              "isGlutenFree": true
          }
      ]
    
  6. ในการคิวรีสําหรับพิซซ่าหนึ่งรายการ คุณสามารถส่งคําขอ GET อื่นได้ แต่ส่งผ่านพารามิเตอร์ id โดยใช้คําสั่งต่อไปนี้:

    get 1
    

    คําสั่งก่อนหน้าส่งกลับ Classic Italian ด้วยผลลัพธ์ต่อไปนี้:

    HTTP/1.1 200 OK
    Content-Type: application/json; charset=utf-8
    Date: Fri, 02 Apr 2021 21:57:57 GMT
    Server: Kestrel
    Transfer-Encoding: chunked
    
    {
        "id": 1,
        "name": "Classic Italian",
        "isGlutenFree": false
    }
    
  7. API ของเรายังจัดการสถานการณ์ที่ไม่มีรายการอยู่ เรียกใช้ API อีกครั้ง แต่ส่งผ่านในพารามิเตอร์พิซซ่า id ที่ไม่ถูกต้องโดยใช้คําสั่งต่อไปนี้:

    get 5
    

    คําสั่งก่อนหน้าส่งกลับข้อผิดพลาด 404 Not Found กับผลลัพธ์ต่อไปนี้:

    HTTP/1.1 404 Not Found
    Content-Type: application/problem+json; charset=utf-8
    Date: Fri, 02 Apr 2021 22:03:06 GMT
    Server: Kestrel
    Transfer-Encoding: chunked
    
    {
        "type": "https://tools.ietf.org/html/rfc7231#section-6.5.4",
        "title": "Not Found",
        "status": 404,
        "traceId": "00-ec263e401ec554b6a2f3e216a1d1fac5-4b40b8023d56762c-00"
    }
    
  8. กลับไปยังเทอร์มินัล dotnet ในรายการดรอปดาวน์ใน Visual Studio Code และปิด API ของเว็บโดยการเลือก CTRL + C บนแป้นพิมพ์ของคุณ

หลังจากที่คุณดําเนินการคํากริยา GET เสร็จสิ้นแล้ว ในหน่วยถัดไป คุณสามารถเพิ่มการดําเนินการเพิ่มเติมไปยัง PizzaController เพื่อสนับสนุนการดําเนินการ CRUD ในข้อมูลพิซซ่า