Prolog收到Json的帖子

时间:2015-12-12 16:56:53

标签: json http post prolog swi-prolog

这是我在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文档非常糟糕,我无法在任何地方找到答案。

2 个答案:

答案 0 :(得分:0)

我不太确定你是否完全理解Prolog和swi-prolog的Web框架是如何工作的。

这是一个一步一步的小型教程,可以帮助您入门:

  1. 将其复制到名为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).
    
  2. 启动swi-prolog并在主要的repl类型中:

    [myserver].
    

    咨询您的档案。你应该没有错误。然后启动你的服务器,比如在端口8000:

    server(8000).
    

    您应该收到以下回复:

    % Started server at http://localhost:8000/
    
  3. 打开另一个终端并使用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])
    
  4. 如果您对文件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系统。