Prolog使用请求头进行HTTP GET请求

3

我想使用Prolog进行HTTP GET请求,并携带请求头,但我不知道如何确切地实现。

以下是在Python中执行此操作的示例:

response = unirest.get("https://poker.p.mashape.com/index.php?players=3",
headers={
"X-Mashape-Key": "mykey",
"Accept": "application/json"
}

这个请求的响应是Json格式的,看起来像这样:
{
"player_cards": {
"1": [
  "Jh",
  "4c"
],
"2": [
  "3s",
  "Js"
],
"3": [
  "3d",
  "5c"
],
"4": [
  "Kh",
  "Qs"
]
},
"showdown": [
"Ks",
"6h",
"4s",
"Ac",
"9h"
],
"winning_hands": {
"1": [
  "4c",
  "4s",
  "Ac",
  "Ks",
  "Jh"
],
"2": [
  "Ac",
  "Ks",
  "Js",
  "9h",
  "6h"
],
"3": [
  "Ac",
  "Ks",
  "9h",
  "6h",
  "5c"
],
"4": [
  "Kh",
  "Ks",
  "Ac",
  "Qs",
  "9h"
]
},
"winners": [
4
]
}

我的Prolog代码

poker(Players) :-
format(atom(HREF),'https://poker.p.mashape.com/index.php?players=~s',[Players]),
http_get(HREF,Json,[]),

如何在此处指定http get请求头,以及我如何存储和使用Json结果?该函数必须打印Json结果,我知道可以通过writeln()实现。

1个回答

3
如果您希望指定HTTP请求头,我建议使用http_open/3而不是http_get/3。例如:
:- use_module(library(http/http_open)).
:- use_module(library(http/json)).

poker(Dict):-
  setup_call_cleanup(
    http_open('https://poker.p.mashape.com/index.php?players=3', In, [request_header('Accept'='application/json')]),
    json_read_dict(In, Dict),
    close(In)
  ).

请注意我使用了setup_call_cleanup/3。这可以确保即使中间的代码失败或抛出异常,流也会被关闭。 json_read_dict/2 返回一个SWI7 dictionary。您需要 SWI-Prolog 版本 7!最好从开发分支的最新提交获取。
看起来您正在使用的 URI 需要 SSL 认证。我相信在 SWI-Prolog 中也可以实现这一点,但我找不到如何完成此操作的示例。请参见我在 SWI-Prolog 邮件列表上的问题

感谢Wouter提供的代码示例。我在您的示例中没有看到X-Mashape-Key作为请求头指定,我认为这是获取Json响应所需的。我将研究SWI7字典,我正在使用版本7。还要感谢您开启有关SSL身份验证的工单,期待对该问题的答复。 - Sybren
刚看到有关 SSL 认证的工单答案,SSL 证书看起来没问题,也许错误是因为请求头中没有指定 mashape 密钥? - Sybren

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接