编辑:我在代码中添加了一个条件语句来检查curl_error($ch)的结果。它显然没有返回错误。我还添加了一个curl_setop来将CURLOPT_POST设置为true。
我正在尝试使用PHP和cURL连接到API,并回调一个JSON响应以显示在页面上。然而,虽然我最初的访问令牌请求通过一个简单的GET请求成功,但我随后的POST请求并没有返回任何数据。
我已经能够使用Postman(下面的屏幕截图)测试POST请求并成功收到响应,因此,我在POST请求中发送的数据似乎是正确的,访问令牌似乎可以工作,但是当我的PHP发出请求时,当我使用json解码然后打印以显示json响应的内容时,似乎没有返回任何内容。
我对cURL非常陌生,所以我的代码取自此链接的教程:https://www.codexworld.com/post-receive-json-data-using-php-curl/.API留档提供于此链接: NUACOM API-报表
以下是我的代码:
$nuacom_get_api_key_url = "https://api.nuacom.ie/login_digest?email=abc@xyz.com&pass=123"; //dummy credentials for stackoverflow
$response_json = file_get_contents($nuacom_get_api_key_url);
$response_array = json_decode($response_json,true);
$session_token = $response_array['session_token'];
// API URL
$url = 'https://api.nuacom.ie/v1/reports/queue_inbound_stats';
// Create a new cURL resource
$ch = curl_init($url);
// Setup request to send json via POST
$data = array(
"group_by" => "day",
"time_from" => "2020-08-27 00:00:01",
"time_to" => "2020-08-27 23:59:59",
"queue" => "1",
"client-security-token" => $session_token
);
$payload = json_encode($data);
// Set the request type to POST
curl_setopt($ch, CURLOPT_POST, 1);
// Attach encoded JSON string to the POST fields
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
// Set the content type to application/json
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:application/json'));
// Return response instead of outputting
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// Execute the POST request
$result = curl_exec($ch);
if(curl_exec($ch) === false)
{
echo 'Curl error: ' . curl_error($ch);
}
else
{
echo 'Operation completed without any errors'; //this is the line that is executed
}
// Close cURL resource
curl_close($ch);
$response_array = json_decode($result);
print_r($response_array);
邮差成功回复:
任何帮助都将不胜感激!我确信,由于对cURL和POST请求不熟悉,我遗漏了一些小东西。
如果您的postman请求工作正常,您可以轻松地将请求导出到php/curl。这个不错的功能让你的生活更轻松。只需单击code
按钮,就可以将请求导出到curl、php/curl、C#、Go和其他几个选项。
在postman中,您通过URL发送数据;在curl中,您通过json编码的请求正文发送数据,向postman发送的等效curl代码为:
$ch = curl_init();
curl_setopt_array($ch, array(
CURLOPT_URL => 'https://api.nuacom.ie/v1/reports/queue_inbound_stats?' . http_build_query(array(
"group_by" => "day",
"time_from" => "2020-08-27 00:00:01",
"time_to" => "2020-08-27 23:59:59",
"queue" => "1",
"client-security-token" => $session_token
)),
CURLOPT_POST => 1
));
curl_exec($ch);
... 但是在阅读文档的时候https://api.nuacom.ie/#operation/QueueReports,似乎他们想要
$ch = curl_init();
curl_setopt_array($ch, array(
CURLOPT_URL => 'https://api.nuacom.ie/v1/reports/queue_inbound_stats',
CURLOPT_POST => 1,
CURLOPT_HTTPHEADER => array(
'Content-Type: application/json',
'client-security-token: '.$session_token,
),
CURLOPT_POSTFIELDS => json_encode(array(
"group_by" => "day",
"time_from" => "2020-08-27 00:00:01",
"time_to" => "2020-08-27 23:59:59",
"queue" => "1",
)),
CURLOPT_POST => 1
));
curl_exec($ch);
因此,就像你对邮递员所做的那样,把所有东西都放在网址里似乎是未定义/未记录的行为,而且它碰巧还是起作用的...
此外,client-security-令牌
不在json中,根据身份验证留档,它可以放在标头或url中,但不在json中,您的curl代码试图将其放在JSON中(而您的邮递员代码把它放在网址,连同其他一切...(
我的坏。也许作为答案比评论更容易,这样我就可以格式化重要的部分。
您正在使用要发送的数据创建阵列:
$data = array(
"group_by" => "day",
"time_from" => "2020-08-27 00:00:01",
"time_to" => "2020-08-27 23:59:59",
"queue" => "1",
"client-security-token" => $session_token
);
当您对它进行json_编码以将其发送到API时,您当前会将其包装在另一个数组中
$payload = json_encode(array($data));
结果将是:
[{"group_by":"day","time_from":"2020-08-27 00:00:01","time_to":"2020-08-27 23:59:59","queue":"1","client-security-token":"token"}]
json数组。“queue_inbound_stats”endpoint的api文档似乎要求数据不要像这样包装在另一个数组中
{"group_by":"day","time_from":"2020-08-27 00:00:01","time_to":"2020-08-27 23:59:59","queue":"1","client-security-token":"token"}
因此,只需省略再次包装$data数组:
$payload = json_encode($data);
所以我已经研究了好几个小时,尝试了不同的东西,研究了好几个小时都没有结果。调用是在提供user和pass之后获取JWT令牌。 当它到达服务器时,morgan看到有一个请求,但我得到的状态是400。这是我的路线 我很难理解护照是怎么回事。authenticate('localAuth')起作用,因此这是我的策略文件,以备需要 更新:我在检查fiddler上的请求时遇到了某种错误。 ~标题~:132
问题内容: 我想知道如何一次获取多个GET URL,然后将获取的JSON数据放入我的React DOM元素中。 这是我的代码: 但是,我想从服务器中获取其他JSON数据,然后使用传递到其中的所有这些JSON数据呈现我的ReactDOM。例如: 这可能吗?如果不是,将多个JSON数据提取到我的渲染ReactDOM元素中的其他解决方案是什么? 问题答案: 您可以在解决方案之前依靠Promises来执行
问题内容: 我正在尝试通过COM端口发送AT命令,但只重新发送了相同的命令。 日志: 16:19:21.910 [main]调试SerialConnections.M234Serial-创建实例。 16:19:21.974 [main]调试SerialConnections.M234Serial-发送请求:AT ^ SCFG? 16:19:23.976 [EventThread COM55]调试S
问题内容: 我有一个 要求: 我想知道默认的超时时间是多少?以及如何将其设置为3秒或不定秒的特定值? 问题答案: 它没有指定的默认值。该规范根本没有讨论超时。 通常,您可以为承诺实现自己的超时包装器: 如https://github.com/github/fetch/issues/175中所述 (https://github.com/mislav)
我正在使用PARSE API发出GET请求。我收到一个“414请求URI太大”错误,但我不明白为什么。这是我请求的代码:
http://maps.googleapis.com/maps/api/directions/json?origin=Central香港 在没有mode=transit参数的情况下,请求可以正常工作,但结果只包括驾驶方向。添加最后一个参数后,我得到: "状况":"INVALID_REQUEST" 我能做些什么来使这个工作?有明确的交通选项,它们列在谷歌地图上。