1

次のような HTML フォームがあります。

<form action="test" method="post">
  <input name="first_name" type="text"/>
  <input name="last_name" type="text" />
  <input name="age" type="text" />
  <input type="submit" value="Send"/>
</form>

PHP、ASP、JSP などの他の手続き型プログラミング言語と同様に、入力フィールドの値を取得して画面に出力するにはどうすればよいですか?

次の方法で問題を解決しようとしました。

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

:- http_handler(root(test), reply, []).
:- http_handler('test', reply, []).

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

reply(Request) :-
        member(method(post), Request), !,
        http_read_data(Request, Data, []),
        format('application/x-www-form-urlencoded', []),
        format(Data).

500これは、コードのエラー (内部サーバー エラー)に過ぎません。

4

3 に答える 3

3

http/http_clientライブラリ ( )を使用する必要があります:- use_module(library(http/http_client))

さらに、テスト用に 2 つのハンドラーを使用するとどのように機能するかわかりません。最後に、特にhtmlドキュメントを返すことが期待されているため、 format(Data) が機能しない可能性があると思います。

ちなみに、フィールドの値を取得するには、次のようにします。

http_read_data(Request, [first_name=FN, last_name=LN, age=A|_], []).

私は http プロローグ ライブラリにかなり慣れていないので、http ://www.pathwayslms.com/swipltuts/html/を確認することをお勧めします。

于 2013-01-16T10:24:01.913 に答える
3

基本的に、リクエスト内のメソッド (メソッド) 用語がメソッド (投稿) であることを確認して、通常どおりリクエストを処理します。

http_read_data はリクエスト本文を読み取ります。本文は URI クエリ文字列のようにエンコードされるため、uri_query_components/2 はそれを Key=Value 用語のリストに変換します

?- uri_query_components('a=b&c=d%2Bw&n=VU%20Amsterdam', Q). Q = [a=b, c='d+w', n='VU アムステルダム'].

同様の情報を探している他の人のために-応答がjsonの場合、 read_json_dict を使用してデータを辞書として取得できます。

于 2013-01-16T23:56:29.403 に答える
2

私は使用しますlibrary(http/http_parameters)。それで、私はできる

load_graph(Request) :-
    http_parameters(Request,
            [path(Path, [atom]),
             aperture(Aperture, [integer])]),

ここで、load_graph はフォームのハンドラです

...
html(form([action(Ref)],
      dl([dt('Root Path'), dd(input([name=path, type=text, value=Default])),
          dt('Aperture'), dd(select([name=aperture], Aplist)),
          dt('Go!'), dd(input([type=submit, value='Load!']))
      ]))).
于 2013-01-16T10:48:55.920 に答える