这是我在stackoverflow中的第一个问题,请耐心等待。
我正在构建一个简单的Prolog api,它接收json帖子并在处理完之后发送另一个json帖子。我发现这段代码接收json:
handle(Request) :-
http_read_json_dict(Request, DictIn),
compute(DictIn, DictOut),
reply_json(DictOut).
我认为compute
是一个自定义谓词,用于测试目的是test(D,D)
。
问题在于,当我尝试在swi-prolog中测试handle(Request)
时,我得到错误消息ERROR: atom_codes/2: Arguments are not sufficiently instantiated
或者我得到了错误。
我假设我只需要传递Request
中的json,但它不起作用。我也尝试用邮件发送一个帖子,在主体中有一个json文件(raw和application / json),但是我得到了一个超时,其中eh..yea ...
我的问题是我在Request中写什么以便它正确地实例化它?
提前感谢,如果这是一个糟糕的/ noobie问题,我很抱歉,但swi-prolog文档非常糟糕,我无法在任何地方找到答案。
答案 0 :(得分:0)
我不太确定你是否完全理解Prolog和swi-prolog的Web框架是如何工作的。
这是一个一步一步的小型教程,可以帮助您入门:
将其复制到名为myserver.pl
的文件中:
:- use_module(library(http/thread_httpd)).
:- use_module(library(http/http_dispatch)).
:- use_module(library(http/http_json)).
:- http_handler(root(.),handle,[]).
server(Port) :-
http_server(http_dispatch,[port(Port)]).
handle(Request) :-
format(user_output,"I'm here~n",[]),
http_read_json(Request, DictIn,[json_object(term)]),
format(user_output,"Request is: ~p~n",[Request]),
format(user_output,"DictIn is: ~p~n",[DictIn]),
DictOut=DictIn,
reply_json(DictOut).
启动swi-prolog并在主要的repl类型中:
[myserver].
咨询您的档案。你应该没有错误。然后启动你的服务器,比如在端口8000:
server(8000).
您应该收到以下回复:
% Started server at http://localhost:8000/
打开另一个终端并使用curl
发布一些json:
curl -H "Content-Type: application/json" -X POST -d '{"hello":"world"}' http://localhost:8000
你应该得到以下答复:
{"hello":"world"}
在正在运行的序言中,您应该看到以下消息:
I'm here
Request is: [protocol(http),peer(ip(127,0,0,1)),pool(client('httpd@8000',user:http_dispatch,<stream>(0x7facc4026b20),<stream>(0x7facc4027040))),input(<stream>(0x7facc4026b20)),method(post),request_uri(/),path(/),http_version(1-1),user_agent('curl/7.35.0'),host(localhost),port(8000),accept([media(_G841/_G842,[],1.0,[])]),content_type('application/json'),content_length(17)]
DictIn is: json([hello=world])
如果您对文件myserver.pl
进行了任何修改,则只需在prolog的repl中输入make.
。
我不能推荐Anne Ogborn's excellent tutorial。顺便说一下,swi-prolog的文档非常好。
答案 1 :(得分:0)
周围还有一些JSON读取器/写入器:
Thise模块带有原子并通过DCG实现:
https://github.com/khueue/prolog-json/tree/master/src
此模块通过ISO流进行定向编码:
https://gist.github.com/jburse/63986bf525784d6d8cf99db132538d67#file-json_io-p
这两种方法都不需要Prolog字典,并且适用于广泛的Prolog系统。