server():- http_server(http_dispatch, [port(45000)]).
serverTest(Request):-http_read_json(Request, JSONIn),
json_to_prolog(JSONIn, PrologIn), format(PrologIn) .
我有这个Prolog程序,但我无法很好地处理PrologIn变量。我收到这个错误:
Type error: `text' expected, found `json([id=3])'
我知道这意味着我不能将格式与 PrologIn 一起使用,但如何处理内部信息呢?意思是,如何提取“id = 3”信息?
修改
这是完整的程序
(如果我使用了足够多的模块,是因为我正在使用该程序做其他事情并且没有过滤到这个特定情况)
:- use_module(library(http/thread_httpd)).
:- use_module(library(http/http_dispatch)).
:- use_module(library(http/http_parameters)).
:- use_module(library(http/http_ssl_plugin)).
:- use_module(library(http/http_open)).
:- use_module(library(http/http_client)).
:- use_module(library(http/http_json)).
:- use_module(library(http/json)).
:- http_handler('/test', serverTest, []).
其余是编辑前的前两个预测
我通过首先进入Prolog的控制台并输入“server()。”来测试它,这将启动服务器。然后我按以下方式使用Postman:选择 POST ,在标题中,键是 Content-Type ,其值为 application / json ,然后,在Body中,我选择 raw (JSON(application-json))并将其写在文本区域中:
{
"id" : 3
}
这是我测试它的方式,我希望能够处理prolog谓词(serverTest)中的id = 3信息。
答案 0 :(得分:4)
您确实需要显示完整的程序,如何启动服务器以及如何查询它。否则,人们只能猜测。
无论如何,这个问题很少:format(PrologIn)
。
首先,正如程序告诉你的那样,这是一个术语。并format
格式化输出。至少,你必须写:
format("~w", [PrologIn])
请参阅documentation on format/2
,基本上,如果您的字词如下:json([id=3])
,则应该打印json([id=3])
。
现在接下来的问题:这会打印到哪里?使用HTTP包库启动服务器时,会重定向输入和输出,以便您可以读取请求并写入响应。库文档中有许多示例。
然后接下来的事情:你是如何得到3的。如果您另外加载http_json plugin module:
:- use_module(library(http/http_json)).
然后你可以直接使用,如代码示例所示,
http_read_json_dict(Request, DictIn)
现在DictIn
是一个“dict”,可能看起来像这样:_{id:3}
。请参阅documentation on dicts。
您不必使用dicts,只需使用正常模式匹配和列表处理检查json
术语。对于某些用例,Dicts更容易(例如,更少打字)。
这是一个适用于我的最小示例。这是服务器代码:
:- use_module(library(http/thread_httpd)).
:- use_module(library(http/http_dispatch)).
:- use_module(library(http/http_json)).
:- http_handler('/test', test, []).
server :-
http_server(http_dispatch, [port(45000)]).
test(Request) :-
http_read_json_dict(Request, JSON),
format(user_error, "~w~n", [JSON.id]).
从顶层开始,在查阅文件后,我运行:
?- server.
% Started server at http://localhost:45000/
true.
此时,我使用另一个命令行中的curl:
$ curl -H "Content-Type: application/json" -d '{"id":3}' http://localhost:45000/test
curl: (52) Empty reply from server
我在服务器运行的Prolog toplevel上打印出3:
?- 3
这当然不理想,所以我用以下内容替换服务器代码中的最后一行:
reply_json(_{foobar:JSON.id}).
然后在服务器运行的Prolog toplevel上,我使用make/0
:
?- make.
% Updating index for library .../lib/swipl-7.3.35/library/
% ... compiled 0.00 sec, 0 clauses
true.
现在,当我再次使用curl时:
$ curl -H "Content-Type: application/json" -d '{"id":3}' http://localhost:45000/test
{"foobar":3}
这就是你所需要的!
答案 1 :(得分:0)
我不知道您的Prolog网络库,但我猜测http_read_json
已将其第二个参数绑定到Prolog术语,因此调用json_to_prolog
是不必要且不正确的
尝试
serverTest(Request) :- http_read_json(Request, JSONIn), format(JSOnIn).
如果要将ID号与收到的ID隔离开来,可能就像
一样简单serverTest(Request) :- http_read_json(Request, json([id=X])),
% ... do something with X value here ... %