แบบฝึกหัด - เพิ่มตัวควบคุม
ตัวควบคุม เป็นคลาสสาธารณะที่มีวิธีการสาธารณะอย่างน้อยหนึ่งวิธีที่เรียกว่าการดําเนินการ ตามแบบแผน ผู้ควบคุมจะถูกวางใน Controllers ของ project root ไดเรกทอรี การดําเนินการจะแสดงเป็นจุดสิ้นสุด HTTP ภายในตัวควบคุม API เว็บ
สร้างตัวควบคุม
เลือกโฟลเดอร์ Controllers ใน Visual Studio Code และเพิ่มไฟล์ใหม่ที่เรียกว่า PizzaController.cs
ไฟล์คลาสว่างที่ชื่อว่า PizzaController.cs จะถูกสร้างขึ้นใน Controllers ไดเรกทอรี Controllers ชื่อไดเรกทอรีเป็นแบบแผน ชื่อไดเรกทอรีมาจากตัวควบคุมแบบจําลอง- มุมมอง สถาปัตยกรรมที่ API เว็บใช้
โน้ต
ตามแบบแผน ชื่อคลาสผู้ควบคุมจะถูกต่อท้ายด้วย Controller
เพิ่มโค้ดต่อไปนี้ลงใน 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();
การดําเนินการก่อนหน้า:
- ตอบสนองเฉพาะคํากริยา
GETHTTP ตามที่ระบุโดยแอตทริบิวต์[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;
}
การดําเนินการก่อนหน้า:
- ตอบสนองเฉพาะคํากริยา
GETHTTP ตามที่ระบุโดยแอตทริบิวต์[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
เปิด ContosoPizza.http
เพิ่ม GET ใหม่เพื่อเรียกใช้จุดสิ้นสุด
Pizzaภายใต้ตัวคั่น ###:GET {{ContosoPizza_HostAddress}}/pizza/ Accept: application/json ###เลือกคําสั่ง ส่งคําขอ ด้านบนการโทร 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 } ]ในการคิวรีสําหรับพิซซ่าหนึ่งรายการ คุณสามารถส่งคําขอ
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 }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)
เปิดเทอร์มินัล
httpreplที่มีอยู่ หรือเปิดเทอร์มินัลรวมใหม่จาก Visual Studio Code โดยการเลือก Terminal> เทอร์มินัลใหม่จากเมนูหลักเชื่อมต่อกับ API เว็บของเรา โดยการเรียกใช้คําสั่งต่อไปนี้:
httprepl https://localhost:{PORT}อีกวิธีหนึ่งคือ เรียกใช้คําสั่งต่อไปนี้ตลอดเวลาในขณะที่
HttpReplกําลังทํางาน:connect https://localhost:{PORT}หากต้องการดูจุดสิ้นสุด
Pizzaที่พร้อมใช้งานใหม่ ให้เรียกใช้คําสั่งต่อไปนี้:lsคําสั่งก่อนหน้าตรวจพบ API ทั้งหมดที่พร้อมใช้งานบนจุดสิ้นสุดการเชื่อมต่อ ซึ่งควรแสดงโค้ดต่อไปนี้:
https://localhost:{PORT}/> ls . [] Pizza [GET] WeatherForecast [GET]ไปที่จุดสิ้นสุด
Pizzaโดยการเรียกใช้คําสั่งต่อไปนี้:cd Pizzaคําสั่งก่อนหน้าแสดงผลลัพธ์ของ API ที่พร้อมใช้งานสําหรับจุดสิ้นสุดการ
Pizza:https://localhost:{PORT}/> cd Pizza /Pizza [GET]ทําการร้องขอ
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 } ]ในการคิวรีสําหรับพิซซ่าหนึ่งรายการ คุณสามารถส่งคําขอ
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 }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" }กลับไปยังเทอร์มินัล
dotnetในรายการดรอปดาวน์ใน Visual Studio Code และปิด API ของเว็บโดยการเลือก CTRL + C บนแป้นพิมพ์ของคุณ
หลังจากที่คุณดําเนินการคํากริยา GET เสร็จสิ้นแล้ว ในหน่วยถัดไป คุณสามารถเพิ่มการดําเนินการเพิ่มเติมไปยัง PizzaController เพื่อสนับสนุนการดําเนินการ CRUD ในข้อมูลพิซซ่า