خادم REST على Prolog ، كيف يبدو؟

كما استطرادا صغير للمبتدئين في البرمجة المنطقية
في هذا النص ، ستعقد جلسة سحرية مع تعريض التعرض النهج
لإنشاء خادم REST ويتم قياس معالمه.

ما هي الفائدة؟ وكل شيء بسيط - سنفعل ذلك على Prolog (في تطبيق SWI-prolog) ...

إذن ما تحتاجه. أولاً ، قم بتنزيل (إن لم يكن بالفعل) ووضع برنامج إدارة المحتوى الفعلي
من موقعه على الانترنت www.swi-prolog.org . من الأسهل إنشاء ملف صغير من النوع rest.pl مع المحتويات الأولية للنوع
الخادم.
مواصلة تنزيله وتحريره باستخدام نظام prolog نفسه ، مثل هذا
(يتم تقديم أمثلة لوحدة التحكم في نظام التشغيل linux ، ولكنها لا تختلف كثيرًا عن نظام windows):

$echo "." > rest.pl $swipl ... ?- [rest]. true. ?- edit(). 

بعد ذلك ، سيبدأ محرر شبيه بـ emac ويمكنك كتابة كل شيء فيه.

لذا ، في البداية ، سنشير إلى أننا سنستخدم المكتبات ونكتب ما يعنيه
إطلاق الخادم - في حروف المقدمة: - يمكن قراءته على أنه "هذا":

 :- use_module(library(http/http_server)). :- use_module(library(http/http_json)). :- http_handler(/,(M), [method(M),methods([get,post]),time_limit(10000)]).  :- http_server(http_dispatch, [port(8080)]). 

كما ترون ، نخطط أن تستجيب الخدمة لطرق get و post.

مشكلة نموذجية


الآن في الواقع ما سنفعله. عند الطلب ، سنرد بصفحة تحتوي على حقل إدخال رقم ، عند إدخالها ، سنطلب طريقة النشر وحساب رقم فيبوناتشي.

هذا هو:

 (get,_) :- (X),(X). (post,) :- http_parameters(,[val(,[integer])]), (). 

حسنا ، هذا كل شيء! لقد كتبنا خادمنا بالفعل ... إن prolog لغة تعريفية - لذلك أعلنا عن خيارات المعالجة. بالمناسبة ، يمكن استخدام أي لغة - قررت الكتابة في أماكن باللغة الروسية.

لكن مهلا ، ماذا يفعل؟ بعد كل شيء ، "النموذج" ، "الإجابة" و "اختصار" هي مسنداتنا ولم يتم تعريفها بعد. دعونا إصلاحه:

 ():- format('Content-type: text/html~n~n <html><body>  <br/> ~w </body></html>~n', []). ('<form method="POST"><input name="val"/></form>'). 

حسنًا ، إليك خياران للحساب - فلنحصل على أرقام فيبوناتشي الإيجابية فقط:

 ():-  > 0, (0,1,1,,),(X), format(atom(),'~w    ~w<br/>~w',[,,X]), (). ():- (X), format(atom(),'  ~w  0<br/>~w',[,X]), (). 

حسنًا ، يبقى تحديد عدد فيبوناتشي فعليًا:

 (_F, F1, N, N, F1) :- !. (F0, F1, I, N, F) :- F2 is F0+F1, I2 is I + 1, !,(F1, F2, I2, N, F). 

هذا التعريف ، بالطبع ، ليس مألوفًا تمامًا في Feng Shui ، لكنه يعتبر أسرع تقريبًا مما لو كتبنا في C ...

فهل هذا العمل؟ نتحقق من:

  ?- . % Started server at http://localhost:8080/ true. 

لذلك ، يبدو أن الخادم قد بدأ. بالمناسبة ، هو multithreaded! للتحقق تحتاج إلى فتح العنوان
127.0.0.1 : 8080 / وأدخل بعض الأرقام - على سبيل المثال ، 1000:
أرقام فيبوناتشي حساب
1000 رقم فيبوناتشي يساوي
4346655768693745643568852767504062580
2564660517371780402481729089536555417
9490518904038798400792551692959225930
8032263477520968962323987332247116164
2996440906533187938298969649928516003
704476137795166849228875
حسنا ، إنه يعمل!

دراسة صغيرة لأداء الخادم - دعونا نتحقق من طريقة GET (من الواضح أن اختبار POST يعتمد بشدة على عدد معين ، لذلك يتم النظر في رقم 10،000،000 ، بالطبع ، ولكن بضع ثوانٍ ...)

  $ ab -k -c 4 -n 4000 http://127.0.0.1:8080/ ... Concurrency Level: 4 Time taken for tests: 0.283 seconds Complete requests: 4000 Failed requests: 0 Keep-Alive requests: 4000 Total transferred: 1108000 bytes HTML transferred: 544000 bytes Requests per second: 14140.57 [#/sec] (mean) Time per request: 0.283 [ms] (mean) Time per request: 0.071 [ms] (mean, across all concurrent requests) Transfer rate: 3825.14 [Kbytes/sec] received ... 

ما يطلب 14140 في الثانية الواحدة مع 10 خيوط - وهذا أمر جيد للغاية لجهاز كمبيوتر منتظم!

ونعم ، مقدمة لديه مثل هذه الفرصة - نظرة منطقية. لذلك إذا قمت بتغيير شيء ما في الكود ، فأنت بحاجة فقط إلى الكتابة في وحدة التحكم

  ?- make. 

وستعمل جميع التغييرات في طلبات جديدة - لا شيء يحتاج إلى التحميل الزائد أو إيقافه أو غير ذلك.

آمل أن تكون مهتمًا برؤية كيفية إنشاء خادم بقية بمثال بسيط. بالطبع ، يمكنك وصف الواجهة الباقية بشكل ثابت ، كما تم في المثال ، يمكنك إدخال جميع أنواع المتغيرات ، واستخدام جزء من مسار URL كمتغيرات - حسنًا ، بشكل عام ، كل شيء كالمعتاد.

يمكنك القيام بذلك بشكل حيوي ، وتغيير منطق البرنامج عن طريق إنشاء وحذف وتعديل المسوحات - نوع من خادم التعديل الذاتي ، الذي يعتمد عمله على السجل. يمكنك توصيل قواعد البيانات. بشكل عام ، كل شيء كالمعتاد ، مجرد العمل بسيط وممتع.

Source: https://habr.com/ru/post/ar471610/


All Articles