当前位置: 首页 > 知识库问答 >
问题:

当相同的请求在Postman中工作时,为什么我对这个API的PHP cURL请求没有提取任何数据?

谢运良
2023-03-14

编辑:我在代码中添加了一个条件语句来检查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请求不熟悉,我遗漏了一些小东西。

共有3个答案

方通
2023-03-14

如果您的postman请求工作正常,您可以轻松地将请求导出到php/curl。这个不错的功能让你的生活更轻松。只需单击code按钮,就可以将请求导出到curl、php/curl、C#、Go和其他几个选项。

李新霁
2023-03-14

在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中(而您的邮递员代码把它放在网址,连同其他一切...(

冯永长
2023-03-14

我的坏。也许作为答案比评论更容易,这样我就可以格式化重要的部分。

您正在使用要发送的数据创建阵列:

$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

  • 我正在使用PARSE API发出GET请求。我收到一个“414请求URI太大”错误,但我不明白为什么。这是我请求的代码:

  • 问题内容: 我有一个 要求: 我想知道默认的超时时间是多少?以及如何将其设置为3秒或不定秒的特定值? 问题答案: 它没有指定的默认值。该规范根本没有讨论超时。 通常,您可以为承诺实现自己的超时包装器: 如https://github.com/github/fetch/issues/175中所述 (https://github.com/mislav)

  • http://maps.googleapis.com/maps/api/directions/json?origin=Central香港 在没有mode=transit参数的情况下,请求可以正常工作,但结果只包括驾驶方向。添加最后一个参数后,我得到: "状况":"INVALID_REQUEST" 我能做些什么来使这个工作?有明确的交通选项,它们列在谷歌地图上。