تمرين - تنفيذ عمليات 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
أعد فتح ملف ContosoPizza.http.
قدِّم طلب
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 }بادر بتحديث البيتزا
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 }يمكن لواجهة برمجة التطبيقات لدينا أيضًا حذف البيتزا التي أُنشئِت حديثًا باستخدام الإجراء
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
أعِد فتح terminal
httpreplالموجودة أو افتح terminal متكاملة جديدة من Visual Studio Code عن طريق تحديد Terminal>New Terminal من القائمة الرئيسية.إذا فتحت terminal جديدة، اتصل بواجهة برمجة تطبيقات الويب عن طريق تشغيل الأمر التالي:
httprepl https://localhost:{PORT}بدلًا من ذلك، شغَّل الأمر التالي في أي وقت أثناء تشغيل
HttpRepl:connect https://localhost:{PORT}انتقل إلى نقطة النهاية
Pizzaعن طريق تشغيل الأمر التالي:cd Pizzaشغَّل الأمر التالي لمشاهدة الإجراءات الجديدة على واجهة برمجة التطبيقات Pizza:
lsيظهر الأمر السابق إخراج واجهات برمجة التطبيقات المتوفرة لنقطة النهاية
Pizza:https://localhost:{PORT}/Pizza> ls . [GET|POST] .. [] {id} [GET|PUT|DELETE]قدِّم طلب
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 }بادر بتحديث البيتزا
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 }يمكن لواجهة برمجة التطبيقات لدينا أيضًا حذف البيتزا التي أُنشئِت حديثًا باستخدام الإجراء
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.