我有一个使用Java脚本的API调用,它的工作方式非常棒:

var headers = {
  Authorization: "Bearer " + MY_ACCESS_TOKEN
};

var requestParams = {
  method: "POST",
  contentType: "application/json",
  headers: headers,
  payload: JSON.stringify({
    query: 'query {adSet(id: "' + MY_ADSET_ID + '") {insights(timeRange: {from: "2023-08-01T00:00:00Z", until: "2023-08-10T23:59:59Z"}timeIncrement: DAILY) {timestamps reports {impressions conversions offerwallImpressions offerwallAverageRank spend}}}}'
  })

var response = UrlFetchApp.fetch(MY_API_ENDPOINT, requestParams);
var data = JSON.parse(response);

When I try to convert this to PHP I simply get a blank repsonse from the API. What am I doing wrong?
Note that my_curl () works correctly when I use it to retrieve $MY_ACCESS_TOKEN from the API.

$postdata = json_encode('query: query {adSet(id: "' . $MY_ADSET_ID . '") {insights(timeRange: {from: "2023-08-01T00:00:00Z", until: "2023-08-10T23:59:59Z"} timeIncrement: DAILY) {timestamps reports {impressions conversions offerwallImpressions offerwallAverageRank spend}}}}');
$endpoint = $MY_API_ENDPOINT;
$headers = array (
    "Content-Type: application/json",
    "Authorization: Bearer " . $MY_ACCESS_TOKEN,
    $postdata
);

$data = my_curl ($endpoint, $headers);
var_dump ($data);

function my_curl ($endpoint, $headers) {
    $ch = curl_init ();

    curl_setopt ($ch, CURLOPT_URL, $endpoint);
    curl_setopt ($ch, CURLOPT_POST, 1);
    curl_setopt ($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt ($ch, CURLOPT_HEADER, false);
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);

    $server_output = curl_exec($ch);
    curl_close ($ch);

    $json = json_decode ($server_output, true);

    return ($json);
}

推荐答案

当您使用json_encode时,您应该提供一个关联数组或对象来编码到JSON中,而不是字符串.在您的例子中,您提供了一个字符串,您在$Headers数组中混合了头和POST数据.我已经添加了Missing CURLOPT_POSTFIELDS选项,以便在cURL请求中包括JSON编码的POST数据,从而允许API正确地接收查询.

<?php
$MY_ACCESS_TOKEN = "your_access_token";
$MY_ADSET_ID = "your_adset_id";
$MY_API_ENDPOINT = "your_api_endpoint";

$postdata = json_encode([
    'query' => 'query {adSet(id: "' . $MY_ADSET_ID . '") {insights(timeRange: {from: "2023-08-01T00:00:00Z", until: "2023-08-10T23:59:59Z"} timeIncrement: DAILY) {timestamps reports {impressions conversions offerwallImpressions offerwallAverageRank spend}}}}'
]);

$endpoint = $MY_API_ENDPOINT;
$headers = array(
    "Content-Type: application/json",
    "Authorization: Bearer " . $MY_ACCESS_TOKEN
);

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $endpoint);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$server_output = curl_exec($ch);
curl_close($ch);

$json = json_decode($server_output, true);

var_dump($json);
?>

Php相关问答推荐

谷歌云SQL / mysql谁是对的?

使用WooCommerce本机产品短码时不考虑价格筛选(_SHORT CODE)

如何优化-PHP 7.3.14+Laravel 6

无法在WooCommerce中发送客户笔记邮箱通知

将购买限制在WooCommerce中具有相同产品属性的项目

多行PHP属性声明中是否允许单行注释

PHP MySQL求和子树并与父树累加

PHP按另一个二维数组的排序顺序对二维数组进行排序

未定义的类型';PDF';在Laravel 8

如何在 Woocommerce 中自动删除旧的已完成订单

WooCommerce 回购自定义插件:如何更新用户钱包?

htaccess Rewriterule 无法以任何方式工作

Woocommerce的数量和价格条件

PHP文件如何从CSS执行

适当的时区处理 Laravel / Carbon

按前 3 列对二维数组中的行数据进行分组,然后用逗号连接每组中的其余列

自定义错误页面不适用于 Apache 和 nginx 设置的 .htaccess

如何从 PHP 中的字符串位置排除图像扩展名

fopen 功能不断向我发送我重新加载网页时已发布的重复版本的表单

将参数传递给 laravel 9 工厂