2013-01-16 71 views
1

如果我有一個HTML表單像這樣的:如何在SWI-Prolog中處理POST請求?

<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」(內部服務器錯誤)錯誤。

回答

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!'])) 
     ]))). 
3

您應該使用http/http_client庫(:- use_module(library(http/http_client)))。

此外,我不知道如何有兩個處理程序的測試將工作。 最後,我認爲格式(數據)可能無法正常工作,特別是因爲它預計會返回一個html文檔。

順便說一句,要檢索的字段,你可以這樣做值:

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

我與HTTP序言LIB相當新的,我會建議檢查http://www.pathwayslms.com/swipltuts/html/