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)))。

此外,我不确定有两个测试处理程序将如何工作。最后,我认为 format(Data) 可能不起作用,特别是因为它预计会返回一个 html 文档。

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

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

我对http prolog lib很陌生,我建议检查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 Amsterdam']。

对于寻找类似信息的其他人 - 如果您的响应是 json,您可以使用 read_json_dict 将数据作为 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 回答