使用JSON回复HTTP请求

时间:2016-12-18 01:44:28

标签: json prolog swi-prolog

我在尝试使用此请求后发送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谓词的文档并不多。欢迎任何帮助,谢谢。

1 个答案:

答案 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 ,这是一个例子。

首先,获取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服务器,你就可以将相同的代码插入到实际的调度中。