2016-12-17 4 views
1

私が要求を行うためにHTTPサーバを使用して、Prologでプログラムを作成しています...プロローグHTTP派遣ハンドルカプセル化

私はそれを再利用することができる方法でコードをカプセル化したいとHTTPのものを持っています

:- http_handler('/test', foobar, []). 

はこのような何かを持っていることが可能です::

一つのモジュールで、別のモジュールでリクエストを処理するために、私の「コントローラ」など

私は、httpディスパッチハンドラ登録で問題が発生し始めました

register_handler(path, callback) :- 
    http_handler(path, callback, []). 

私はそれを使ってみましたが、 "コールバック"パラメータのためにエラーが発生している可能性があります。私が使用しても、コールバック述語は、別のモジュールで定義されている:

:-consult(api_controller). 

[EDIT]

server.pl

:- use_module(library(http/thread_httpd)). 
:- use_module(library(http/http_dispatch)). 
:- use_module(library(http/http_parameters)). 
:- use_module(library(http/http_json)). 

:- use_module(api_controller). 

:- http_handler('/test', foo, []). 

server(Port):-http_server(http_dispatch, [port(Port)]). 

api_controller.pl

foo(_request) :- 
    format('Content-type: text/plain~n~n'), 
    format('Hello world!~n'). 

エラー

http_dispatch:call_action/2: Undefined procedure: foo/1 

答えて

2

http_handler/3ディレクティブで、あなたが他のファイルで、このようなディレクティブを配置し、それらをロードするためにinclude/1を使用することができます。

また、あなたは、次のようにジェネリックハンドラをインストールすることにより、HTTP  派遣オーバー完全にコントロールを持つことができます。

 
:- http_handler(/, handle_request, [prefix]). 

prefixオプション。この例では

 
handle_request(Request) :- 
     debug(my_dispatch, "~q\n", [Request]), 
     memberchk(path(Path0), Request), 
     atom_concat(., Path0, Path1), 
     http_safe_file(Path1, []), 
     absolute_file_name(Path1, Path), 
     ( reply_file(Path0, File) -> http_reply_file(File, [unsafe(true)], Request) 
     ; redirect(Path0, Other) -> http_redirect(moved, Other, Request) 
     ; see_other(Path0, Other) -> http_redirect(see_other, Other, Request) 
     ; hidden_file(Path0)  -> http_404([], Request) 
     ; exists_file(Path)  -> http_reply_file(Path, [unsafe(true)], Request) 
     ; ... 
     ). 

、以下の述語はあなたは、あなたの正確な使用にサーバーを調整する  によって供給されるように意図されている :

はその後、あなたはこのような例えば、適切なhandle_request/1を供給します例は:

  • reply_file(Path, File):  Pathを要求に応じて内容Fileを送信します。
  • redirect(Path0, Path)   Path0に応答してPathにリダイレクトします。
  • see_other/2:これは練習として残っています。
  • hidden_file/1:これは練習問題として残っています。

これらのルールは、他の場所で定義することができ、あなたはディレクティブでこれらのファイルを含めることができます。あなたがチェックアウトする必要があり

 
:- include(other_source). 

関連ディレクティブはmultifile/1です。

私は上記のことが練習として機能するために必要な正確なライブラリを考え出します。出発点:

 
:- use_module(library(http/thread_httpd)). 
:- use_module(library(http/http_dispatch)). 
:- use_module(library(http/http_server_files)). 
:- use_module(library(http/http_files)). 
:- use_module(library(http/http_header)). 
+0

お返事ありがとうございます。私は理解したと思う! –

+0

実際、それは私のために働いていない..編集plzを参照してください –

+0

私のポストPLZを参照してください。現在、あなたは 'include/1'を使わず** use_module/1'を使っていません。あなたは**/**を使っていません。 'prefix'オプションは' [] 'です。 – mat

関連する問題