תרגיל - הוספת בקר

הושלם

בקר הוא ציבורית עם מחלקה ציבורית אחת או יותר שנקראת פעולות ופעולות. לפי מוסכמה, בקר ממוקם במדריך הכתובות של של הפרוייקט. הפעולות חשופות כנקודות קצה של HTTP בתוך בקר ה- API של האינטרנט.

יצירת בקר

  1. בחר את התיקיה ב- Visual Studio Code והוסף קובץ חדש בשם PizzaController.cs.

    צילום מסך של Visual Studio Code המציג הוספת קובץ חדש לתיקיה 'בקרים'.

    קובץ מחלקה ריק בשם PizzaController.cs נוצר במדריך הכתובות שלך. המוסכמה בקרים מדריך הכתובות היא מוסכמה. שם הספריה מגיע מתהצגת הדגם -ה ארכיטקטורה שבה משתמש ה- API של האינטרנט.

    הערה

    לפי מוסכמה, שמות המחלקה של הבקר מסוכמות עם הבקר.

  2. הוסף את הקוד הבא /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

  1. פתח ContosoPizza.http

  2. הוסף נקודת GET כדי להתקשר אל Pizza הקצה תחת ### המפריד:

    GET {{ContosoPizza_HostAddress}}/pizza/
    Accept: application/json
    
    ###
    
  3. בחר את שלח בקשה מעל שיחה חדשה קבל זו.

    הפקודה הקודמת מחזירה רשימה של כל הפיצות ב- 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 הפועלים. ביחידה הבאה, באפשרותך להוסיף פעולות נוספות כדי לתמוך בפעולות CRUD PizzaController נתוני פיצה.

אופציונלי: בדוק את הבקר עם לולאת קריאה של HTTP של שורתEval-Print (REPL)

  1. פתח את המסוף httprepl, או פתח מסוף משולב חדש מ- Visual Studio Code על-ידי בחירת Terminal>New 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 הפועלים. ביחידה הבאה, באפשרותך להוסיף פעולות נוספות כדי לתמוך בפעולות CRUD PizzaController נתוני פיצה.