تمرين - تنفيذ عمليات 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.