תרגיל - הוספת בקר
בקר הוא ציבורית עם מחלקה ציבורית אחת או יותר שנקראת פעולות ופעולות. לפי מוסכמה, בקר ממוקם במדריך הכתובות של של הפרוייקט. הפעולות חשופות כנקודות קצה של HTTP בתוך בקר ה- API של האינטרנט.
יצירת בקר
בחר את התיקיה ב- Visual Studio Code והוסף קובץ חדש בשם PizzaController.cs.
קובץ מחלקה ריק בשם PizzaController.cs נוצר במדריך הכתובות שלך. המוסכמה בקרים מדריך הכתובות היא מוסכמה. שם הספריה מגיע מתהצגת הדגם -ה ארכיטקטורה שבה משתמש ה- API של האינטרנט.
הערה
לפי מוסכמה, שמות המחלקה של הבקר מסוכמות עם הבקר.
הוסף את הקוד הבא /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 ההערה בקרים/PizzaController.cs בקוד הבא:
[HttpGet]
public ActionResult<List<Pizza>> GetAll() =>
PizzaService.GetAll();
הפעולה הקודמת:
- מגיב רק לפועל HTTP
GET, כפי שמציין[HttpGet]תכונת ה- HTTP. - החזרת מופע
ActionResultמסוגList<Pizza>. סוגActionResultהוא מחלקת הבסיס עבור כל תוצאות הפעולה ב- ASP.NET Core. - שאילתת השירות עבור כל הפיצה והחזרה אוטומטית של נתונים עם ערך
Content-Typeשלapplication/json.
אחזור פיצה אחת
ייתכן גם שהלקוח מעוניין לבקש מידע אודות פיצה ספציפית במקום הרשימה כולה. באפשרותך ליישם פעולת GET נוספת הדורשת פרמטר id אוטומטי. באפשרותך להשתמש בתכונה המוכללת [HttpGet("{id}")] להגדיר שיטה המחזירה את הפיצות מהשירות שלנו. לוגיקת הניתוב רושמת [HttpGet] (ללא id) [HttpGet("{id}")] (עם id) כשתי מסלולים שונים. לאחר מכן תוכל לכתוב פעולה נפרדת כדי לאחזר פריט יחיד.
החלף // GET by Id action ההערה בקרים/PizzaController.cs בקוד הבא:
[HttpGet("{id}")]
public ActionResult<Pizza> Get(int id)
{
var pizza = PizzaService.Get(id);
if(pizza == null)
return NotFound();
return pizza;
}
הפעולה הקודמת:
- מגיב רק לפועל HTTP
GET, כפי שמציין[HttpGet]תכונת ה- HTTP. - דורש שערך הפרמטר
idייכלל במקטע כתובת ה- URL לאחרpizza/. זכור, תכונת הבקר[Route]הגדירה את/pizzaהבקר. - שאילתות במסד הנתונים עבור פיצה התואמת לפרמטר
idשסופק.
כל ActionResult מופע המשמש בפעולה הקודמת ממופה לקוד המצב המתאים של HTTP בטבלה הבאה:
| ASP.NET ליבה תוצאת פעולה |
קוד מצב HTTP | תיאור |
|---|---|---|
Ok משתמע |
200 | מוצר התואם לפרמטר id שסופק קיים במטמון בתוך הזיכרון.המוצר כלול בגוף התגובה בסוג המדיה, כפי שהוגדר בכותרת בקשת HTTP (JSON כברירת accept כברירת מחדל). |
NotFound |
404 | מוצר התואם לפרמטר id שסופק אינו קיים במטמון הזיכרון. |
בנה והפעל את הבקר החדש
בנה והפעל את ה- API של האינטרנט על-ידי הפעלת הפקודה הבאה:
dotnet run
בדוק את הבקר עם קובץ Http
פתח ContosoPizza.http
הוסף נקודת GET כדי להתקשר אל
Pizzaהקצה תחת ### המפריד:GET {{ContosoPizza_HostAddress}}/pizza/ Accept: application/json ###בחר את שלח בקשה מעל שיחה חדשה קבל זו.
הפקודה הקודמת מחזירה רשימה של כל הפיצות ב- 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 הפועלים. ביחידה הבאה, באפשרותך להוסיף פעולות נוספות כדי לתמוך בפעולות CRUD PizzaController נתוני פיצה.
אופציונלי: בדוק את הבקר עם לולאת קריאה של HTTP של שורתEval-Print (REPL)
פתח את המסוף
httprepl, או פתח מסוף משולב חדש מ- Visual Studio Code על-ידי בחירת Terminal>New 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 הפועלים. ביחידה הבאה, באפשרותך להוסיף פעולות נוספות כדי לתמוך בפעולות CRUD PizzaController נתוני פיצה.