تمرين - تنفيذ عمليات CRUD

مكتمل

دعنا نواصل توسيع وحدة تحكم واجهة برمجة تطبيقات الويب لدينا لإضافة القدرة على إنشاء (POST)، وتحديث (PUT)، وحذف (DELETE) بيتزا من مخزوننا.

إضافة البيتزا

لنمكن إضافة بيتزا من خلال واجهة برمجة تطبيقات الويب باستخدام الأسلوب POST.

// POST action استبدل التعليق في Controllers/PizzaController.cs بالتعليمات البرمجية التالية:

[HttpPost]
public IActionResult Create(Pizza pizza)
{            
    PizzaService.Add(pizza);
    return CreatedAtAction(nameof(Get), new { id = pizza.Id }, pizza);
}

الإجراء السابق:

  • يستجيب فقط إلى الفعل HTTP POST، كما هو موضح بواسطة السمة [HttpPost].
  • يُدرج عنصر نص الطلب Pizza في ذاكرة التخزين المؤقت في الذاكرة.

إشعار

نظرا لأن وحدة التحكم مشروحة بالسمة [ApiController] ، فمن الضمني أنه سيتم العثور على المعلمة Pizza في نص الطلب.

تمثل المعلمة الأولى في CreatedAtAction استدعاء الأسلوب اسم إجراء. nameof يتم استخدام الكلمة الأساسية لتجنب الترميز الثابت لاسم الإجراء. CreatedAtAction يستخدم اسم الإجراء لإنشاء location عنوان استجابة HTTP مع عنوان URL للبيتزا التي جرى إنشاؤها حديثًا، كما هو موضح في الوحدة السابقة.

تعديل بيتزا

والآن لنعمل على تمكين تحديث بيتزا من خلال واجهة برمجة تطبيقات الويب باستخدام الأسلوب PUT.

// PUT action استبدل التعليق في Controllers/PizzaController.cs بالتعليمات البرمجية التالية:

[HttpPut("{id}")]
public IActionResult Update(int id, Pizza pizza)
{
    if (id != pizza.Id)
        return BadRequest();
           
    var existingPizza = PizzaService.Get(id);
    if(existingPizza is null)
        return NotFound();
   
    PizzaService.Update(pizza);           
   
    return NoContent();
}

الإجراء السابق:

  • يستجيب فقط إلى فعل HTTP PUT، كما هو موضح بواسطة السمة [HttpPut] .
  • يتطلب تضمين قيمة المعلمة id في مقطع URL بعد pizza/.
  • يتم إرجاع IActionResult، لأن نوع الإرجاع ActionResult غير معروف حتى وقت التشغيل. الأساليب BadRequest وNotFound وNoContent تعيد الأنواع BadRequestResult وNotFoundResult وNoContentResult على التوالي.

إشعار

نظرا لأن وحدة التحكم مشروحة بالسمة [ApiController] ، فمن الضمني أنه سيتم العثور على المعلمة Pizza في نص الطلب.

إزالة بيتزا

أخيرًا، لنعمل على تمكين إزالة بيتزا من خلال واجهة برمجة تطبيقات الويب باستخدام الأسلوب DELETE.

// DELETE action استبدل التعليق في Controllers/PizzaController.cs بالتعليمات البرمجية التالية:

[HttpDelete("{id}")]
public IActionResult Delete(int id)
{
    var pizza = PizzaService.Get(id);
   
    if (pizza is null)
        return NotFound();
       
    PizzaService.Delete(id);
   
    return NoContent();
}

الإجراء السابق:

  • يستجيب فقط إلى الفعل HTTP DELETE، كما هو موضح بواسطة السمة [HttpDelete].
  • يتطلب تضمين قيمة المعلمة id في مقطع URL بعد pizza/.
  • إرجاع IActionResult لأن ActionResult نوع الإرجاع غير معروف حتى وقت التشغيل. يتم NotFound إرجاع NoContent الأسلوبين و NotFoundResult وNoContentResult، على التوالي.
  • للاستعلام عن ذاكرة التخزين المؤقت في الذاكرة لبيتزا تطابق المعلمة id المُقدمة.

تذكر حفظ الملف Controllers/PizzaController.cs قبل المتابعة،

إنشاء واجهة برمجة تطبيقات الويب وتشغيلها

أنشئ واجهة برمجة تطبيقات الويب وابدأ تشغيلها عن طريق تشغيل الأمر التالي:

dotnet run

اختبار واجهة برمجة تطبيقات الويب النهائية مع ملفات HTTP

  1. أعد فتح ملف ContosoPizza.http.

  2. قدِّم طلب POSTلإضافة بيتزا جديدة في HttpRepl باستخدام الأمر التالي:

    POST {{ContosoPizza_HostAddress}}/pizza/
    Content-Type: application/json
    
    {
        "name": "Hawaii",
        "isGlutenFree": false
    }
    
    ###
    

    يقوم الأمر السابق بإرجاع البيتزا التي تم إنشاؤها حديثا:

    HTTP/1.1 201 Created
    Connection: close
    Content-Type: application/json; charset=utf-8
    Date: Wed, 17 Jan 2024 17:03:02 GMT
    Server: Kestrel
    Location: http://localhost:5192/Pizza/3
    Transfer-Encoding: chunked
    
    {
        "id": 3,
        "name": "Hawaii",
        "isGlutenFree": false
    }
    
  3. بادر بتحديث البيتزا Hawaii الجديدة إلى بيتزا Hawaiian مع طلب PUTباستخدام الأمر التالي:

    PUT {{ContosoPizza_HostAddress}}/pizza/3
    Content-Type: application/json
    
    {
        "id": 3,
        "name": "Hawaiian",
        "isGlutenFree": false
    }
    
    ###
    

    يرجع الأمر السابق الإخراج التالي الذي يشير إلى نجاح:

    HTTP/1.1 204 No Content
    Connection: close
    Date: Wed, 17 Jan 2024 17:07:30 GMT
    Server: Kestrel
    

    للتحقق من تحديث البيتزا، بادر بإعادة تشغيل الإجراء GET باستخدام الأمر التالي:

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

    يرجع الأمر السابق البيتزا المُحدثة مؤخراً:

    HTTP/1.1 200 OK
    Connection: close
    Content-Type: application/json; charset=utf-8
    Date: Wed, 17 Jan 2024 17:09:01 GMT
    Server: Kestrel
    Transfer-Encoding: chunked
    
    {
        "id": 3,
        "name": "Hawaiian",
        "isGlutenFree": false
    }
    
  4. يمكن لواجهة برمجة التطبيقات لدينا أيضًا حذف البيتزا التي أُنشئِت حديثًا باستخدام الإجراء DELETE عن طريق تشغيل الأمر التالي:

    DELETE {{ContosoPizza_HostAddress}}/pizza/3
    
    ###
    

    يرجع الأمر السابق نتيجة 204 No Content للنجاح:

    HTTP/1.1 204 No Content
    Date: Fri, 02 Apr 2021 23:30:04 GMT
    Server: Kestrel
    

    للتحقق من إزالة البيتزا، بادر بإعادة تشغيل الإجراء GET باستخدام الأمر التالي:

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

    يرجع الأمر السابق البيتزا الأصلية كنتائج:

    HTTP/1.1 200 OK
    Content-Type: application/json; charset=utf-8
    Date: Fri, 02 Apr 2021 23:31:15 GMT
    Server: Kestrel
    Transfer-Encoding: chunked
    
    [
        {
            "id": 1,
            "name": "Classic Italian",
            "isGlutenFree": false
        },
        {
            "id": 2,
            "name": "Veggie",
            "isGlutenFree": true
        }
    ]
    

لقد انتهيت الآن من تنفيذ واختبار واجهة برمجة تطبيقات ويب تم إنشاؤها حديثا تم إنشاؤها باستخدام ASP.NET Core.

اختياري: اختبار واجهة برمجة تطبيقات الويب النهائية باستخدام سطر الأوامر HTTPREPL

  1. أعِد فتح terminal httprepl الموجودة أو افتح terminal متكاملة جديدة من Visual Studio Code عن طريق تحديد Terminal>New Terminal من القائمة الرئيسية.

  2. إذا فتحت terminal جديدة، اتصل بواجهة برمجة تطبيقات الويب عن طريق تشغيل الأمر التالي:

    httprepl https://localhost:{PORT}
    

    بدلًا من ذلك، شغَّل الأمر التالي في أي وقت أثناء تشغيل HttpRepl:

    connect https://localhost:{PORT}
    
  3. انتقل إلى نقطة النهاية Pizza عن طريق تشغيل الأمر التالي:

    cd Pizza
    
  4. شغَّل الأمر التالي لمشاهدة الإجراءات الجديدة على واجهة برمجة التطبيقات Pizza:

    ls
    

    يظهر الأمر السابق إخراج واجهات برمجة التطبيقات المتوفرة لنقطة النهاية Pizza:

        https://localhost:{PORT}/Pizza> ls
        .      [GET|POST]
        ..     []
        {id}   [GET|PUT|DELETE]
    
  5. قدِّم طلب POSTلإضافة بيتزا جديدة في HttpRepl باستخدام الأمر التالي:

    post -c "{"name":"Hawaii", "isGlutenFree":false}"
    

    يقوم الأمر السابق بإرجاع البيتزا التي تم إنشاؤها حديثا:

    HTTP/1.1 201 Created
    Content-Type: application/json; charset=utf-8
    Date: Fri, 02 Apr 2021 23:23:09 GMT
    Location: https://localhost:{PORT}/Pizza?id=3
    Server: Kestrel
    Transfer-Encoding: chunked
    
    {
        "id": 3,
        "name": "Hawaii",
        "isGlutenFree": false
    }
    
  6. بادر بتحديث البيتزا Hawaii الجديدة إلى بيتزا Hawaiian مع طلب PUTباستخدام الأمر التالي:

    put 3 -c  "{"id": 3, "name":"Hawaiian", "isGlutenFree":false}"
    

    يرجع الأمر السابق الإخراج التالي الذي يشير إلى نجاح:

    HTTP/1.1 204 No Content
    Date: Fri, 02 Apr 2021 23:23:55 GMT
    Server: Kestrel
    

    للتحقق من تحديث البيتزا، بادر بإعادة تشغيل الإجراء GET باستخدام الأمر التالي:

    get 3
    

    يرجع الأمر السابق البيتزا المُحدثة مؤخراً:

    HTTP/1.1 200 OK
    Content-Type: application/json; charset=utf-8
    Date: Fri, 02 Apr 2021 23:27:37 GMT
    Server: Kestrel
    Transfer-Encoding: chunked
    
    {
        "id": 3,
        "name": "Hawaiian",
        "isGlutenFree": false
    }
    
  7. يمكن لواجهة برمجة التطبيقات لدينا أيضًا حذف البيتزا التي أُنشئِت حديثًا باستخدام الإجراء DELETE عن طريق تشغيل الأمر التالي:

    delete 3
    

    يرجع الأمر السابق نتيجة 204 No Content للنجاح:

    HTTP/1.1 204 No Content
    Date: Fri, 02 Apr 2021 23:30:04 GMT
    Server: Kestrel
    

    للتحقق من إزالة البيتزا، بادر بإعادة تشغيل الإجراء GET باستخدام الأمر التالي:

    get
    

    يرجع الأمر السابق البيتزا الأصلية كنتائج:

    HTTP/1.1 200 OK
    Content-Type: application/json; charset=utf-8
    Date: Fri, 02 Apr 2021 23:31:15 GMT
    Server: Kestrel
    Transfer-Encoding: chunked
    
    [
        {
            "id": 1,
            "name": "Classic Italian",
            "isGlutenFree": false
        },
        {
            "id": 2,
            "name": "Veggie",
            "isGlutenFree": true
        }
    ]
    

لقد انتهيت الآن من تنفيذ واختبار واجهة برمجة تطبيقات ويب تم إنشاؤها حديثا تم إنشاؤها باستخدام ASP.NET Core.