0Pricing
R Academy · درس

إنشاء نقاط نهاية GET وPOST

تعامل مع معاملات المسار وسلاسل الاستعلام وتحليل نص الطلب

إنشاء نقاط نهاية GET وPOST درس مجاني في R Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في R Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة R Academy 4 دروس في المجموع.

ما هو Plumber؟

يحوّل plumber دوال R العادية إلى نقاط نهاية HTTP API باستخدام تعليقات توضيحية خاصة. أضف إلى دالة التعليق التوضيحي #* @get /path، فينشئ Plumber مسار GET يستدعي تلك الدالة ويعيد نتيجتها بصيغة JSON.

ثبّته باستخدام install.packages('plumber').

نقطة نهاية GET الأولى

توجد واجهة Plumber API أساسية في ملف (مثل api.R). أضف إلى الدالة التعليق التوضيحي #* @get متبوعًا بالمسار. ويحوّل Plumber قيمة الإرجاع للدالة إلى JSON تلقائيًا.

# api.R
# library(plumber)
#
# #* Return a greeting
# #* @get /hello
# function() {
#   list(message = 'Hello from Plumber!')
# }
#
# Start with:
# pr <- plumb('api.R')
# pr$run(port = 8000)

معلمات المسار مع تلميحات النوع

ضمّن مقاطع المسار المتغيرة باستخدام صيغة الأقواس الزاوية: /users/<id:int>. يحلل Plumber المقطع ويمرره إلى دالتك كوسيط ذي نوع محدد. وتشمل الأنواع المدعومة int وdbl وchr.

# #* Get a user by ID
# #* @get /users/<id:int>
# function(id) {
#   # id is already an integer
#   list(
#     user_id = id,
#     name    = paste('User', id)
#   )
# }
#
# GET /users/42  =>  {"user_id":42, "name":"User 42"}

معلمات الاستعلام باستخدام #* @param

وثّق معلمات الاستعلام باستخدام #* @param name Description. يجب أن يطابق اسم المعلمة اسم وسيط الدالة. ويقرأها Plumber تلقائيًا من سلسلة الاستعلام — ولا حاجة إلى تحليل يدوي.

# #* Search users by name
# #* @param name The name to search for
# #* @param limit Maximum results to return
# #* @get /users/search
# function(name = '', limit = '10') {
#   limit <- as.integer(limit)
#   # query string: /users/search?name=Alice&limit=5
#   list(query = name, max = limit)
# }

إنشاء نقطة نهاية POST

استخدم #* @post /path لنقاط النهاية التي تستقبل جسم طلب. يتيح الوسيط الخاص req الوصول إلى كائن الطلب الخام. ويمرره Plumber تلقائيًا عندما يكون اسم وسيط الدالة req.

# #* Create a new user
# #* @post /users
# function(req) {
#   body <- jsonlite::fromJSON(req$postBody)
#   # body$name, body$email are now available
#   list(
#     status  = 'created',
#     user_id = sample(1000:9999, 1),
#     name    = body$name
#   )
# }

تحليل جسم الطلب

يحتوي req$postBody على سلسلة JSON الخام من جسم POST. حلّلها باستخدام jsonlite::fromJSON(req$postBody) للحصول على قائمة R مسماة. تحقّق دائمًا من الحقول المطلوبة قبل المعالجة.

# #* @post /orders
# function(req, res) {
#   body <- jsonlite::fromJSON(req$postBody)
#   if (is.null(body$product_id)) {
#     res$status <- 400L
#     return(list(error = 'product_id is required'))
#   }
#   list(
#     order_id   = as.integer(Sys.time()),
#     product_id = body$product_id,
#     quantity   = body$quantity %||% 1
#   )
# }

رموز حالة HTTP باستخدام res$status

يتيح لك الوسيط res (الذي يحقنه Plumber تلقائيًا أيضًا) ضبط رمز حالة استجابة HTTP. اضبطه قبل الإرجاع: res$status <- 404L. ومن الرموز الشائعة:

  • 200 — موافق (افتراضي)
  • 201 — تم الإنشاء
  • 400 — طلب غير صالح
  • 404 — غير موجود
  • 500 — خطأ داخلي في الخادم
# #* @get /items/<id:int>
# function(id, res) {
#   items <- list(
#     list(id=1, name='Widget'),
#     list(id=2, name='Gadget')
#   )
#   found <- Filter(function(x) x$id == id, items)
#   if (length(found) == 0) {
#     res$status <- 404L
#     return(list(error = paste('Item', id, 'not found')))
#   }
#   found[[1]]
# }

إرجاع القوائم المسماة بصيغة JSON

يحوّل Plumber قيم الإرجاع من R إلى JSON باستخدام jsonlite. وتصبح القوائم المسماة كائنات JSON، بينما تصبح القوائم غير المسماة مصفوفات JSON. أعد قائمة مسماة للاستجابات المنظمة.

# Named list => JSON object
# list(id=1, name='Alice')  => {"id":1, "name":"Alice"}
#
# Unnamed list => JSON array
# list(1, 2, 3)  =>  [1, 2, 3]
#
# Nested structures work too:
# list(
#   user   = list(id=1, name='Alice'),
#   orders = list(list(id=101), list(id=102))
# )
# => {"user":{"id":1,"name":"Alice"}, "orders":[{"id":101},{"id":102}]}

كائن موجّه Plumber

حمّل ملف R مشروحًا باستخدام plumb('api.R') لإنشاء كائن router من Plumber. استدعِ pr$run(port = 8000) لبدء الخادم. وفي بيئة الإنتاج، تستدعي عادةً pr_run(pr, host='0.0.0.0', port=8000).

# Standard plumber startup in api_start.R:
# library(plumber)
# pr <- plumb('api.R')
# pr$run(port = 8000, host = '0.0.0.0')
#
# Or with pipe style:
# plumb('api.R') |> pr_run(port = 8000)
#
# Test with:
# curl http://localhost:8000/hello

التعامل مع أساليب HTTP المتعددة

يمكن لمسار واحد دعم عدة أساليب من خلال كتابة دوال منفصلة مشروحة بالتعليقات التوضيحية. يوجّه Plumber الطلبات إلى الدالة الصحيحة استنادًا إلى أسلوب HTTP المستخدم.

# #* List all products
# #* @get /products
# function() {
#   list(products = list(list(id=1, name='Widget')))
# }
#
# #* Create a product
# #* @post /products
# function(req) {
#   body <- jsonlite::fromJSON(req$postBody)
#   list(created = TRUE, name = body$name)
# }

اختبار نقاط نهاية API الخاصة بكم

استخدموا curl من الطرفية أو httr2 من R لاختبار نقاط النهاية أثناء تشغيل الخادم. يتيح لكم httr2 كتابة اختبارات قابلة لإعادة الإنتاج بجانب شفرة API الخاصة بكم.

# From terminal:
# curl http://localhost:8000/users/42
# curl -X POST http://localhost:8000/users \
#      -H 'Content-Type: application/json' \
#      -d '{"name":"Alice","email":"alice@example.com"}'
#
# From R:
# library(httr2)
# resp <- request('http://localhost:8000/users/42') |> req_perform()
# resp_body_json(resp)

تحقق سريع: معاملات المسار

كيف تعلنون عن معامل مسار باسم id بحيث يحلله Plumber كعدد صحيح؟

مراجعة نقاط نهاية GET وPOST

إنشاء نقاط نهاية REST باستخدام Plumber:

  • ينشئ #* @get /path مسار GET؛ وينشئ #* @post /path مسار POST
  • تستخدم معاملات المسار الصيغة <name:type> (int وdbl وchr)
  • تُحلل معاملات الاستعلام تلقائيًا وتُمرر إلى وسيطات الدالة المطابقة
  • يتوفر نص POST عبر jsonlite::fromJSON(req$postBody)
  • اضبطوا res$status لاستجابات HTTP غير 200
  • أعيدوا قوائم مسماة — إذ تُحوّل تلقائيًا إلى كائنات JSON

الأسئلة الشائعة

هل درس «إنشاء نقاط نهاية GET وPOST» مجاني؟

نعم — نص درس «إنشاء نقاط نهاية GET وPOST» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة R Academy، انتقل إلى CoddyKit PRO. تتضمن دورة R Academy 4 دروس في المجموع.

ماذا ستتعلم في «إنشاء نقاط نهاية GET وPOST»؟

تعامل مع معاملات المسار وسلاسل الاستعلام وتحليل نص الطلب تتمرن على R Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ R Academy؟

لا تُشترط خبرة سابقة. R Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «إنشاء نقاط نهاية GET وPOST»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس R Academy هذا؟

نعم. كل درس في R Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. مقدمة إلى Plumber وREST
  2. إنشاء نقاط نهاية GET وPOST
  3. المصادقة وأمان API
  4. نشر Plumber APIs في بيئة الإنتاج
← العودة إلى R Academy