2015-12-12 111 views
2

这是我在stackoverflow中的第一个问题,所以,忍受着我。Prolog接收Json的帖子

我打算构建一个简单的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文件(原始和应用程序/ JSON)的邮件,但我得到一个超时,呃..yea ... 我的问题是我在Request中写什么,以便它实例化它正确吗?

在此先感谢和抱歉,如果这是一个坏/ noobie问题,但swi-prolog文档是可怕的,我无法找到任何答案。

+0

我发现swi-prolog文档非常好!也许你应该阅读[Anne Ogborn的优秀教程](http://www.pathwayslms.com/swipltuts/html/)! –

+0

感谢您的提示。我尝试阅读该教程,但我没有找到任何有关json请求和回复的信息... –

回答

1

我不太确定您完全理解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-序言和主回复类型:

    [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('[email protected]',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任何修改,你只需要在序言的REPL键入make.。我不能推荐足够的Anne Ogborn's excellent tutorial。顺便说一句,swi-prolog的文档非常好。

+0

非常感谢您的时间。这非常有帮助。我是一个很好的示范驱动学习者,我一步一步地找到了解最好的方法去理解这些东西的作用。关于swi-prolog文档的问题是,它们只提供每个谓词的描述,并假设我们知道如何使用它们,而我并不这样做。我仍然在为prolog实现例子找到一个好地方。即使谷歌这次失败了。 –