Serveur REST sur Prolog, à quoi ça ressemble?

Comme une petite digression pour les non-initiés dans la programmation logique
dans ce texte une session magique aura lieu avec l'exposition donnée l'approche
pour créer un serveur REST et ses paramètres sont mesurés.

Quelle est la prise? Et tout est simple - nous le ferons sur le Prolog (dans l'implémentation de SWI-prolog) ...

Donc, ce dont vous avez besoin. Tout d'abord, téléchargez (si ce n'est déjà fait) et mettez le swi-prolog réel
à partir de son site Web www.swi-prolog.org . Il est plus facile de créer un petit fichier de type rest.pl avec le contenu initial de type
serveur
continuer à le télécharger et à le modifier à l'aide du système prolog lui-même, comme celui-ci
(des exemples sont donnés pour la console linux, mais pas très différents de Windows):

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

Après cela, un éditeur de type emacs démarre et vous pouvez tout y taper.

Donc, au début, nous indiquerons que nous allons utiliser des bibliothèques et écrire ce que cela signifie
lancement du serveur - dans les caractères du prologue: - peut être lu comme "ceci est":

 :- 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)]). 

Comme vous pouvez le voir, nous prévoyons que le service répondra aux méthodes get et post.

Problème de modèle


Maintenant, en fait, ce que nous allons faire. Sur demande, nous répondrons avec une page avec un champ de saisie de numéro, lors de la saisie, nous demanderons la méthode de publication et calculerons ce numéro de Fibonacci.

Soit:

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

Eh bien, c'est tout! Nous avons déjà écrit notre serveur ... Le prologue est un langage déclaratif - nous avons donc déclaré les options de traitement. Soit dit en passant, n'importe quelle langue peut être utilisée - j'ai décidé d'écrire dans des endroits en russe.

Mais bon, que fait-il? Après tout, le «formulaire», la «réponse» et le «raccourcissement» sont nos prédicats et ils ne sont pas encore définis. Corrigeons-le:

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

Eh bien, voici deux options de calcul - ayons seulement des nombres de Fibonacci positifs:

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

Eh bien, il reste à déterminer réellement quel est le nombre de Fibonacci:

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

Cette définition, bien sûr, n'est pas tout à fait familière en Feng Shui , mais elle est considérée comme presque plus rapide que si nous écrivions en C ...

Alors ça va marcher? Nous vérifions:

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

Ainsi, le serveur semble avoir démarré. Soit dit en passant, il est multithread! Pour vérifier, vous devez ouvrir l'adresse
127.0.0.1 : 8080 / et entrez un nombre - par exemple, 1000:
Calcul des nombres de Fibonacci
1000 Nombre de Fibonacci égal
4346655768693745643568852767504062580
2564660517371780402481729089536555417
9490518904038798400792551692959225930
8032263477520968962323987332247116164
2996440906533187938298969649928516003
704476137795166849228875
Et bien ça marche!

Une petite étude des performances du serveur - vérifions la méthode GET (le POST dépend évidemment fortement d'un nombre donné, donc un nombre de 10 000 000 est considéré, bien sûr, mais quelques secondes ...)

  $ 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 ... 

Quel 14140 requêtes par seconde avec 10 threads - c'est très bien pour un ordinateur ordinaire!

Et oui, le prologue a une telle opportunité - un look logique. Donc, si vous changez quelque chose dans le code, il vous suffit de taper dans la console

  ?- make. 

Et toutes vos modifications fonctionneront dans de nouvelles demandes - rien ne doit être surchargé, arrêté, etc.

J'espère que vous étiez intéressé de voir comment créer un serveur de repos avec un exemple aussi simple. Bien sûr, vous pouvez décrire statiquement l'interface restante, comme cela a été fait dans l'exemple, vous pouvez entrer toutes sortes de variables, utiliser une partie du chemin URL comme variables - enfin, en général, tout est comme d'habitude.

Vous pouvez le faire dynamiquement, changer la logique du programme en créant, supprimant et modifiant des prédicats - une sorte de serveur auto-modifiable, dont le travail dépend de l'historique. Vous pouvez connecter des bases de données. En général, tout est comme d'habitude, le travail est simple et agréable.

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


All Articles