如何在SWI-Prolog中处理POST请求?

时间:2013-01-16 07:12:36

标签: html forms post prolog swi-prolog

如果我有像这样的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”的错误(内部服务器错误)。

3 个答案:

答案 0 :(得分:3)

您应该使用http/http_client库(:- use_module(library(http/http_client)))。

此外,我不确定如何让两个测试处理程序工作。 最后,我认为格式(数据)可能不起作用,特别是因为它应该返回一个html文档。

顺便说一句,要检索字段的值,您可以执行以下操作:

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

我对http prolog lib很新,我建议检查http://www.pathwayslms.com/swipltuts/html/

答案 1 :(得分:3)

基本上,您将像正常一样处理请求,检查请求中的方法(方法)术语是方法(帖子)。

http_read_data将读取请求正文。 正文将被编码为URI查询字符串,因此uri_query_components / 2 会将其转换为Key = Value terms

列表

? - uri_query_components('a = b&amp; c = d%2Bw&amp; n = VU%20Amsterdam',Q)。 Q = [a = b,c ='d + w',n ='VU Amsterdam']。

对于寻找类似信息的其他人 - 如果您的回复是json,则可以使用read_json_dict将数据作为词典获取。

答案 2 :(得分: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!']))
      ]))).