2015-12-12 113 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實現例子找到一個好地方。即使谷歌這次失敗了。 –