Sebagai penyimpangan kecil bagi yang belum tahu dalam pemrograman logis
dalam teks ini
sesi sulap akan
diadakan dengan pendekatan
pemaparan yang diberikan
untuk membuat server REST dan parameternya diukur.
Apa yang menangkap? Dan semuanya sederhana - kita akan melakukannya di Prolog (dalam implementasi SWI-prolog) ...
Jadi apa yang kamu butuhkan. Pertama, unduh (jika belum) dan pasang swi-prolog yang sebenarnya
dari situs webnya
www.swi-prolog.org . Lebih mudah membuat file kecil bertipe rest.pl dengan konten awal tipe
server
terus unduh dan edit menggunakan sistem prolog itu sendiri, seperti ini
(contoh diberikan untuk konsol linux, tetapi tidak jauh berbeda dari windows):
$echo "." > rest.pl $swipl ... ?- [rest]. true. ?- edit().
Setelah itu, editor seperti emacs akan mulai dan Anda dapat mengetikkan semua yang ada di dalamnya.
Jadi, pada awalnya, kami akan menunjukkan bahwa kami akan menggunakan perpustakaan dan menulis apa artinya
peluncuran server - dalam karakter prolog: - dapat dibaca sebagai "ini":
:- 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)]).
Seperti yang Anda lihat, kami berencana bahwa layanan akan menanggapi metode mendapatkan dan memposting.
Masalah model
Sekarang sebenarnya apa yang akan kita lakukan. Atas permintaan, kami akan merespons dengan halaman dengan bidang input angka, ketika memasukkannya, kami akan meminta metode posting dan menghitung angka Fibonacci ini.
Itu adalah:
(get,_) :- (X),(X). (post,) :- http_parameters(,[val(,[integer])]), ().
Yah, itu dia! Kami sebenarnya telah menulis server kami ... Prolog adalah bahasa deklaratif - jadi kami mendeklarasikan opsi pemrosesan. Ngomong-ngomong, bahasa apa pun bisa digunakan - saya memutuskan untuk menulis di tempat-tempat dalam bahasa Rusia.
Tapi hei, apa yang dia lakukan? Bagaimanapun, "formulir", "jawaban" dan "singkat" adalah predikat kami dan belum ditetapkan. Mari kita perbaiki:
():- format('Content-type: text/html~n~n <html><body> <br/> ~w </body></html>~n', []). ('<form method="POST"><input name="val"/></form>').
Nah, berikut adalah dua opsi untuk menghitung - mari kita hanya memiliki angka Fibonacci positif:
():- > 0, (0,1,1,,),(X), format(atom(),'~w ~w<br/>~w',[,,X]), (). ():- (X), format(atom(),' ~w 0<br/>~w',[,X]), ().
Yah, masih harus menentukan apa sebenarnya angka Fibonacci:
(_F, F1, N, N, F1) :- !. (F0, F1, I, N, F) :- F2 is F0+F1, I2 is I + 1, !,(F1, F2, I2, N, F).
Definisi ini, tentu saja, tidak cukup akrab
di Feng Shui , tetapi dianggap hampir lebih cepat daripada jika kita ...
Apakah ini akan berhasil? Kami memeriksa:
?- . % Started server at http://localhost:8080/ true.
Jadi, server sepertinya sudah mulai. Omong-omong, ini multithreaded! Untuk memeriksa Anda perlu membuka alamat
127.0.0.1 : 8080 / dan masukkan beberapa nomor - misalnya, 1000:
Perhitungan angka fibonacci
1000 angka Fibonacci sama dengan
4346655768693745643568852767504062580
2564660517371780402481729089536555417
9490518904038798400792551692959225930
8032263477520968962323987332247116164
2996440906533187938298969649928516003
704476137795166849228875
Ya berhasil!
Sebuah studi kecil tentang kinerja server - mari kita periksa metode GET (POST jelas sangat tergantung pada angka yang diberikan, jadi angka 10.000.000 dianggap, tentu saja, tetapi beberapa detik ...)
$ 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 [
Apa permintaan 14140 per detik dengan 10 utas - ini sangat baik untuk komputer biasa!
Dan ya, prolognya memiliki peluang seperti itu - tampilan yang logis. Jadi, jika Anda mengubah sesuatu dalam kode, maka Anda hanya perlu mengetikkan konsol
?- make.
Dan semua perubahan Anda akan berfungsi dalam permintaan baru - tidak ada yang perlu kelebihan beban, dihentikan, dll.
Saya harap Anda tertarik untuk melihat cara membuat rest-server dengan contoh sederhana. Tentu saja, Anda dapat menggambarkan antarmuka sisanya secara statis, seperti yang dilakukan pada contoh, Anda dapat memasukkan semua jenis variabel, gunakan bagian dari jalur URL sebagai variabel - well, secara umum, semuanya seperti biasa.
Anda dapat melakukan ini secara dinamis, mengubah logika program dengan membuat, menghapus, dan memodifikasi predikat - semacam server pengubah sendiri, yang pekerjaannya tergantung pada sejarah. Anda dapat menghubungkan basis data. Secara umum, semuanya seperti biasa, hanya bekerja itu sederhana dan menyenangkan.