我在尝试使用此请求后发送JSON:http://localhost:8080/json_test?id=1 到目前为止,这是我的代码:
:- use_module(library(http/thread_httpd)).
:- use_module(library(http/http_dispatch)).
:- use_module(library(http/http_parameters)).
:- http_handler('/json_test', json_test, []).
nomeEdificio(1, "Torre dos Clérigos").
nomeEdificio(2, "Fonte dos Leões").
anoConstrucao(1, 1754).
anoConstrucao(2, 1882).
anoInauguracao(1, 1763).
anoInauguracao(2, 1884).
server(Port) :-
http_server(http_dispatch, [port(Port)]).
json_test(Request) :-
http_parameters(Request,
[ id(Id, [])]
),
compute_request(Id,PrologOut),
prolog_to_json(PrologOut,JSonOut),
reply_json(JSonOut).
compute_request(Id,PrologOut):-
nomeEdificio(Id,N), anoConstrucao(Id,Ac), anoInauguracao(Id,Ai), % Some consulting operations
PrologOut = json([ name=N,
dates=json([yearConstruction=Ac, yearInauguration=Ai])
]).
但是我收到了这个错误:
"Internal server error
goal unexpectedly failed: user:json_test([protocol(http),peer(ip(127,0,0,1)),pool(client('httpd@8080',user:http_dispatch,<stream>(00000000056CE8C0),<stream>(00000000056CCD90))),input(<stream>(00000000056CE8C0)),method(get),request_uri('/json_test?id=1'),path('/json_test'),search([id='1']),http_version(1-1),host(localhost),port(8080),user_agent('Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0'),accept([media(text/html,[],1.0,[]),media(application/'xhtml+xml',[],1.0,[]),media(application/xml,[],0.9,[]),media(_G3007/_G3008,[],0.8,[])]),accept_language('en-US,en;q=0.5'),accept_encoding('gzip, deflate'),connection('keep-alive'),upgrade_insecure_requests('1')])"
我无法弄清楚错误是什么,关于如何使用这些Prolog谓词的文档并不多。欢迎任何帮助,谢谢。
答案 0 :(得分:2)
当我加载您发布的代码时,我得到:
catch/3: Undefined procedure: http_handler/3
所以,我补充道:
:- use_module(library(http/thread_httpd)).
接下来,当我加载修改后的示例并使用?- server(4040).
启动服务器,然后访问http://localhost:4040/json_test
时,我得到:
Internal server error Undefined procedure: http_dispatch/1
所以,我补充道:
:- use_module(library(http/http_dispatch)).
然后,当我重新加载并重新访问时,我得到:
Internal server error Undefined procedure: http_parameters/2
所以,我补充道:
:- use_module(library(http/http_parameters)).
id
当然,我们必须提供id
,所以我访问了例如:
http://localhost:4040/json_test?id=x
然后,我得到:
Internal server error Undefined procedure: nomeEdificio/2
要调试此类问题,您需要尽可能简化所有内容,并发布简化的自包含示例,并明确说明如何运行测试用例
在上文中,您省略了:
你不能指望别人填补这些极端遗漏。
至于你的实际问题,你的主要问题完全被你发布的内容所掩盖。要回复JSON ,这是一个例子。
首先,获取JSON:
:- use_module(library(http/json_convert)). :- json_object point(x:integer, y:integer).
示例查询:
?- prolog_to_json(point(10,30), JSON). JSON = json([x=10, y=30]).
这个需要上面的指令,否则它不起作用!这是直接来自SWI-Prolog文档的,这是一个很好的资源,可以找到有关这些主题的更多信息。
然后,回答这样一个词:
?- prolog_to_json(point(10,30), JSON), reply_json(JSON). Content-type: application/json; charset=UTF-8 {"x":10, "y":30} ...
所以,从小做起:一旦你这个运行没有 HTTP服务器,你就可以将相同的代码插入到实际的调度中。