cURL,如何添加此特定参数?

时间:2019-12-09 22:41:32

标签: php api curl sendinblue

我必须创建一个PHP脚本,该脚本将在我的sendinblue数据库中创建新的联系人。 Sendinblue有一个API,其中包含一个PHP代码生成器来完成此任务。该文档位于:https://developers.sendinblue.com/reference#createcontact

这是我的代码:

<?php
$curl = curl_init();
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt_array($curl, array(
    CURLOPT_URL => "https://api.sendinblue.com/v3/contacts",
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_ENCODING => "",
    CURLOPT_MAXREDIRS => 10,
    CURLOPT_TIMEOUT => 30,
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
    CURLOPT_CUSTOMREQUEST => "POST",
    CURLOPT_POSTFIELDS => "{\"email\":\"testCreateContact@test.com\",\"emailBlacklisted\":true,\"smsBlacklisted\":false,\"listIds\":[2],\"updateEnabled\":true}",
    CURLOPT_HTTPHEADER => array(
        "accept: application/json",
        "api-key: *****",
        "content-type: application/json"
    ),
));
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
    echo "cURL Error #:" . $err;
} else {
    echo $response;
}

现在,我正在寻找如何通过POST请求发送attributes字段,因为您无法在文档页面的代码创建者中添加attributesenter image description here

因此,我不理解在代码中包含attributes字段的语法。谢谢!

编辑: 因此,现在香港专业教育学院尝试了这部分代码:

curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);


curl_setopt($curl, CURLOPT_URL, "https://api.sendinblue.com/v3/contacts");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_ENCODING, "");
curl_setopt($curl, CURLOPT_MAXREDIRS, 10);
curl_setopt($curl, CURLOPT_TIMEOUT, 30);
curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($curl, CURLOPT_POSTFIELDS, [
    'email' => 'testCreateContact@test.com',
    'emailBlacklisted' => true,
    'smsBlacklisted' => false,
    'listIds' => [2],
    'updateEnabled' => true,
    'attributes' => json_encode([
        "FNAME" => "Elly",  //ERROR LINE
        "LNAME" => "Roger",
    ]),
  ]);

curl_setopt($curl, CURLOPT_HTTPHEADER, array(
    "accept: application/json",
    "api-key: ****",
    "content-type: application/json"
  ));

但是它仍然不起作用,我得到了这个错误: Array to string conversion +这个: {"error":{"status":400,"message":"Input must be a valid JSON object","code":"bad_request"}}

文档说属性必须是一个对象,所以我真的不知道该怎么做。文档确实很好,但是他们在这里错过了一些东西……(没有例子)

2 个答案:

答案 0 :(得分:2)

从外观上看,只需将其添加到CURLOPT_POSTFIELDS中的POST字段中即可。但是,尝试操纵JSON编码的字符串而不是一些简单的true / false声明会变得非常混乱,特别是在执行3d数组并担心在PHP中转义引号时。我建议您改用PHP数组简化操作,这也将使在POST请求中包含attributes字段变得更加容易。

编辑:从远程服务器返回的错误消息看来,他们的API要求POST数据以JSON对象而不是标准'para1=val1&para2=val2&...'格式发送,因此,您只需要对整个POST数组进行JSON编码即可创建单个JSON编码的对象:

curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode([
    'email' => 'testCreateContact@test.com',
    'emailBlacklisted' => true,
    'smsBlacklisted' => false,
    'listIds' => [2],
    'updateEnabled' => true,
    'attributes' => [
        'FNAME' => 'Elly',
        'LNAME' => 'Roger',
    ],
]));

或者如果您想使用curl_setopt_array(),可以这样做:

<?php
$curl = curl_init();
curl_setopt_array($curl, array(
    CURLOPT_SSL_VERIFYHOST => false,
    CURLOPT_SSL_VERIFYPEER => false,
    CURLOPT_URL => 'https://api.sendinblue.com/v3/contacts',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_ENCODING => '',
    CURLOPT_MAXREDIRS => 10,
    CURLOPT_TIMEOUT => 30,
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_POSTFIELDS => json_encode([
        'email' => 'testCreateContact@test.com',
        'emailBlacklisted' => true,
        'smsBlacklisted' => false,
        'listIds' => [2],
        'updateEnabled' => true,
        'attributes' => [
            'FNAME' => 'Elly',
            'LNAME' => 'Roger',
        ],
    ]),
    CURLOPT_HTTPHEADER => array(
        'accept: application/json',
        'api-key: *****',
        'content-type: application/json'
    ),
));

答案 1 :(得分:0)

我找到了可行的解决方案:

  CURLOPT_URL => "https://api.sendinblue.com/v3/contacts",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => "{\"attributes\":{\"NOM\":\"james\"},\"email\":\"testCreateContact@test.com\",
  \"emailBlacklisted\":false,\"smsBlacklisted\":false,\"listIds\":[2],\"updateEnabled\":true}",
  CURLOPT_HTTPHEADER => array(
    "accept: application/json",
    "api-key: ****",
    "content-type: application/json"
  ),
));```

Thx