Я пытаюсь обновить информацию о клиенте в Perfex CRM через их API.
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://example.com/api/customers/39',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'PUT',
CURLOPT_POSTFIELDS => array('company' => 'test'),
CURLOPT_HTTPHEADER => array(
'authtoken: example'
),
));
curl_exec($curl);
curl_close($curl);
Токен авторизации и идентификатор клиента были перепроверены.
Протестировано на Postman, и ответ следующий:
{
"status": false,
"message": "Data Not Acceptable OR Not Provided"
}
Документацию по API для этой конечной точки можно найти здесь.
И да, заголовок authtoken
используется вместо того, что они упомянули Authorization
в документации по ссылке выше, потому что это то, что нужно использовать, они подтвердили это (я пробовал с Authorization
, и ответ Token is not defined.
)
Ниже приведен успешно работающий пример еще одной из их конечных точек, для которой требуется метод POST:
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://example.com/api/contacts/',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => array(
'customer_id' => $userid,
'firstname' => $firstname,
'lastname' => $lastname,
'email' => $email,
'phonenumber' => $phonenumber,
'password' => $password,
'is_primary' => 'on',
'donotsendwelcomeemail' => 'on',
'permissions' => array("1", "2", "3", "4", "5", "6")
),
CURLOPT_HTTPHEADER => array(
'Authtoken: example'
),
));
curl_exec($curl);
curl_close($curl);
Документацию по API для этой конечной точки можно найти здесь.
P.S. Согласно php.net/manual/en/function.curl-setopt.php, когда вы предоставляете массив PHP в CURLOPT_POSTFIELDS, для заголовка Content-Type будет установлено значение multipart/form-data, а элементы данных будут отправлены как поля в составном запросе. Кажется, сервер, возможно, не принимает это.
@ADyson Я пробовал другие их конечные точки POST, и всем им требовались данные в CURLOPT_POSTFIELDS
. Но я попробую JSON. :)
they all required data in CURLOPT_POSTFIELDS
...да, вы по-прежнему вводите данные в это поле, но (потенциально) важен формат данных. Но если вы говорите, что другие конечные точки работают с использованием того же подхода, который вы показали выше, это означает, что я могу быть не прав. Было бы полезно, если бы вы могли отредактировать свой вопрос, чтобы также предоставить рабочий пример для подробного сравнения.
Однако прямо во вступлении к этим документам говорится, что «API Perfex работает через HTTPS и использует JSON в качестве формата данных».
@ADyson Я добавил в свой вопрос рабочий пример другой конечной точки в том же API. И в настоящее время я пытаюсь опубликовать JSON, вернусь с результатом. Спасибо за помощь. :)
Без проблем. Кроме того, чтобы прояснить кое-что, когда вы говорите «Проверено на Postman», вы говорите, что каким-то образом импортировали этот PHP-код в Postman? Или вы создали в почтальоне то, что вы считаете эквивалентным запросом? Или наоборот — почтальон сгенерировал для вас этот PHP-код из запроса, который вы сгенерировали вручную в инструменте?
@ADyson Вы были правы, когда я разместил данные в формате JSON, это сработало. Чтобы ответить на ваш последний запрос, код, который я разместил здесь, был сгенерирован Postman. Позвольте мне протестировать обновленный код на моем сервере и подтвердить. Вы хотите опубликовать ответ, и я могу выбрать его?
Во вступлении к этим документам говорится, что
API Perfex работает через HTTPS и использует JSON в качестве формата данных.
Но согласно https://php.net/manual/en/function.curl-setopt.php, когда вы предоставляете массив PHP для CURLOPT_POSTFIELDS
, для заголовка Content-Type будет установлено значение multipart/form-data
, а элементы данных, которые вы поставки будут отправлены в виде полей в составном запросе.
Чтобы вместо этого отправить данные в формате JSON, вы можете сделать это:
CURLOPT_POSTFIELDS => json_encode(array('company' => 'test')),
Вам также может понадобиться правильно установить заголовок Content-Type:
CURLOPT_HTTPHEADER => array(
'Authtoken: example',
'Content-Type: application/json'
),
Документация вообще не проясняет, но, возможно, вы должны отправлять данные в формате JSON? Это всего лишь предположение, но все их примеры показывают, что ответы приходят в формате JSON, поэтому логично предположить, что они хотят, чтобы данные запроса также были в формате JSON — по крайней мере, стоит попробовать.