Prolog рдкрд░ REST рд╕рд░реНрд╡рд░, рдпрд╣ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ?

рддрд╛рд░реНрдХрд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ uninitiated рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рд╡рд┐рд╖рдпрд╛рдВрддрд░ рдХреЗ рд░реВрдк рдореЗрдВ
рдЗрд╕ рдкрд╛рда рдореЗрдВ рдПрдХ рдореИрдЬрд┐рдХ рд╕реЗрд╢рди рдХреЛ рдПрдХреНрд╕рдкреЛрдЬрд╝рд░ рджрд┐рдП рдЧрдП рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛
REST рд╕рд░реНрд╡рд░ рдФрд░ рдЙрд╕рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдкрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдХреИрдЪ рдХреНрдпрд╛ рд╣реИ? рдФрд░ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ - рд╣рдо рдЗрд╕реЗ рдкреНрд░реЛрд▓реЙрдЧ (рдПрд╕рдбрдмреНрд▓реНрдпреВрдЖрдИ-рдкреНрд░реЛрд▓реЙрдЧ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ) рдкрд░ рдХрд░реЗрдВрдЧреЗ ...

рддреЛ рдЖрдкрдХреЛ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдПред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ (рдпрджрд┐ рдкрд╣рд▓реЗ рд╕реЗ рдирд╣реАрдВ рд╣реИ) рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реНрд╡рд╛рдЗ-рдкреНрд░реЛрд▓реЙрдЧ рд▓рдЧрд╛рдПрдВ
рдЙрд╕рдХреА рд╡реЗрдмрд╕рд╛рдЗрдЯ www.swi-prolog.org рд╕реЗ ред рдЯрд╛рдЗрдк рдХреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде rest.pl рдХреА рдПрдХ рдЫреЛрдЯреА рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдирд╛ рдЖрд╕рд╛рди рд╣реИ
рд╕рд░реНрд╡рд░ред
рдЗрд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВ рдФрд░ рдЦреБрдж рдХреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░реЛрд▓реЙрдЧ рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ
(рдЙрджрд╛рд╣рд░рдг рд▓рд┐рдирдХреНрд╕ рдХрдВрд╕реЛрд▓ рдХреЗ рд▓рд┐рдП рджрд┐рдП рдЧрдП рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЦрд┐рдбрд╝рдХрд┐рдпреЛрдВ рд╕реЗ рдмрд╣реБрдд рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИрдВ):

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

рдЙрд╕рдХреЗ рдмрд╛рдж, рдПрдХ рдПрдордПрд╕реАрдПрд╕ рдЬреИрд╕рд╛ рд╕рдВрдкрд╛рджрдХ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЖрдк рдЗрд╕рдореЗрдВ рд╕рдм рдХреБрдЫ рдЯрд╛рдЗрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕рд▓рд┐рдП, рд╢реБрд░реБрдЖрдд рдореЗрдВ, рд╣рдо рд╕рдВрдХреЗрдд рджреЗрдВрдЧреЗ рдХрд┐ рд╣рдо рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИ, рд▓рд┐рдЦреЗрдВрдЧреЗ
рд╕рд░реНрд╡рд░ рд▓реЙрдиреНрдЪ - рдкреНрд░реЛрд▓реЙрдЧ рд╡рд░реНрдгреЛрдВ рдореЗрдВ: - рдХреЛ "рдпрд╣ рд╣реИ" рдХреЗ рд░реВрдк рдореЗрдВ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 :- 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,_) :- (X),(X). (post,) :- http_parameters(,[val(,[integer])]), (). 

рдЦреИрд░, рдпрд╣ рдмрд╛рдд рд╣реИ! рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдкрдирд╛ рд╕рд░реНрд╡рд░ рд▓рд┐рдЦрд╛ рдерд╛ ... рдкреНрд░реЛрд▓реЙрдЧ рдПрдХ рдШреЛрд╖рдгрд╛рддреНрдордХ рднрд╛рд╖рд╛ рд╣реИ - рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╡рд┐рдХрд▓реНрдк рдШреЛрд╖рд┐рдд рдХрд┐рдПред рд╡реИрд╕реЗ, рдХрд┐рд╕реА рднреА рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рдореИрдВрдиреЗ рд░реВрд╕реА рдореЗрдВ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред

рд▓реЗрдХрд┐рди рд╣реЗ, рд╡рд╣ рдХреНрдпрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ? рдЖрдЦрд┐рд░рдХрд╛рд░, "рдлрд╝реЙрд░реНрдо", "рдЙрддреНрддрд░" рдФрд░ "рдЫреЛрдЯрд╛" рд╣рдорд╛рд░реА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рд╣реИрдВ рдФрд░ рд╡реЗ рдЕрднреА рддрдХ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИрдВред рдЪрд▓реЛ рдЗрд╕реЗ рдареАрдХ рдХрд░реЗрдВ:

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

рдпрд╣ рдкрд░рд┐рднрд╛рд╖рд╛, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдлреЗрдВрдЧ рд╢реБрдИ рдореЗрдВ рдХрд╛рдлреА рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рд▓рдЧрднрдЧ рддреЗрдЬреА рд╕реЗ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдЕрдЧрд░ рд╣рдордиреЗ рд╕реА рдореЗрдВ рд▓рд┐рдЦрд╛ ...

рддреЛ рдХреНрдпрд╛ рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛? рд╣рдо рдЬрд╛рдБрдЪ рдХрд░рддреЗ рд╣реИрдВ:

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

рддреЛ, рд╕рд░реНрд╡рд░ рд╢реБрд░реВ рд╣реЛ рдЧрдпрд╛ рд╣реИред рд╡реИрд╕реЗ, рдпрд╣ рдорд▓реНрдЯреАрдереНрд░реЗрдбреЗрдб рд╣реИ! рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдкрддрд╛ рдЦреЛрд▓рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ
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 ... 

10 рдереНрд░реЗрдб рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 14140 рдЕрдиреБрд░реЛрдз рдХреНрдпрд╛ рд╣реИ - рдпрд╣ рдПрдХ рдирд┐рдпрдорд┐рдд рдХрдВрдкреНрдпреВрдЯрд░ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ!

рдФрд░ рд╣рд╛рдВ, рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛ рдореЗрдВ рдРрд╕рд╛ рдЕрд╡рд╕рд░ рд╣реИ - рдПрдХ рддрд╛рд░реНрдХрд┐рдХ рд░реВрдкред рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк рдХреЛрдб рдореЗрдВ рдХреБрдЫ рдмрджрд▓рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдмрд╕ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ

  ?- make. 

рдФрд░ рдЖрдкрдХреЗ рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрди рдирдП рдЕрдиреБрд░реЛрдзреЛрдВ рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ - рдХреБрдЫ рднреА рдЕрддрд┐рднрд╛рд░рд┐рдд, рдмрдВрдж рдХрд░рдиреЗ рдЖрджрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдк рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдЪреНрдЫреБрдХ рдереЗ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рдмрд╛рдХреА рд╕рд░реНрд╡рд░ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдПред рдмреЗрд╢рдХ, рдЖрдк рдмрд╛рдХреА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рд╡рд░реНрдгрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЖрдк рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЪрд░ рджрд░реНрдЬ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, URL рдкрде рдХреЗ рднрд╛рдЧ рдХреЛ рдЪрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдареАрдХ рд╣реИ, рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╕рдм рдХреБрдЫ рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ рд╣реИред

рдЖрдк рдЗрд╕реЗ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╡рд┐рдзреЗрдп рдХреЛ рд╣рдЯрд╛, рд╣рдЯрд╛рдХрд░ рдФрд░ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдХреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рддрд░реНрдХ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ - рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕реНрд╡-рд╕рдВрд╢реЛрдзрд┐рдд рд╕рд░реНрд╡рд░, рдЬрд┐рд╕рдХрд╛ рдХрд╛рдо рдЗрддрд┐рд╣рд╛рд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдЖрдк рдбреЗрдЯрд╛рдмреЗрд╕ рдХрдиреЗрдХреНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╕рдм рдХреБрдЫ рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ рд╣реЛрддрд╛ рд╣реИ, рдмрд╕ рдХрд╛рдо рдХрд░рдирд╛ рд╕рд░рд▓ рдФрд░ рд╕реБрдЦрдж рд╣реЛрддрд╛ рд╣реИред

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


All Articles