Perfex CRM API - обновление клиента с помощью метода PUT не работает

Я пытаюсь обновить информацию о клиенте в 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 для этой конечной точки можно найти здесь.

Документация вообще не проясняет, но, возможно, вы должны отправлять данные в формате JSON? Это всего лишь предположение, но все их примеры показывают, что ответы приходят в формате JSON, поэтому логично предположить, что они хотят, чтобы данные запроса также были в формате JSON — по крайней мере, стоит попробовать.

ADyson 25.11.2022 10:46

P.S. Согласно php.net/manual/en/function.curl-setopt.php, когда вы предоставляете массив PHP в CURLOPT_POSTFIELDS, для заголовка Content-Type будет установлено значение multipart/form-data, а элементы данных будут отправлены как поля в составном запросе. Кажется, сервер, возможно, не принимает это.

ADyson 25.11.2022 10:47

@ADyson Я пробовал другие их конечные точки POST, и всем им требовались данные в CURLOPT_POSTFIELDS. Но я попробую JSON. :)

ILG 25.11.2022 10:48
they all required data in CURLOPT_POSTFIELDS...да, вы по-прежнему вводите данные в это поле, но (потенциально) важен формат данных. Но если вы говорите, что другие конечные точки работают с использованием того же подхода, который вы показали выше, это означает, что я могу быть не прав. Было бы полезно, если бы вы могли отредактировать свой вопрос, чтобы также предоставить рабочий пример для подробного сравнения.
ADyson 25.11.2022 10:48

Однако прямо во вступлении к этим документам говорится, что «API Perfex работает через HTTPS и использует JSON в качестве формата данных».

ADyson 25.11.2022 10:50

@ADyson Я добавил в свой вопрос рабочий пример другой конечной точки в том же API. И в настоящее время я пытаюсь опубликовать JSON, вернусь с результатом. Спасибо за помощь. :)

ILG 25.11.2022 10:58

Без проблем. Кроме того, чтобы прояснить кое-что, когда вы говорите «Проверено на Postman», вы говорите, что каким-то образом импортировали этот PHP-код в Postman? Или вы создали в почтальоне то, что вы считаете эквивалентным запросом? Или наоборот — почтальон сгенерировал для вас этот PHP-код из запроса, который вы сгенерировали вручную в инструменте?

ADyson 25.11.2022 11:11

@ADyson Вы были правы, когда я разместил данные в формате JSON, это сработало. Чтобы ответить на ваш последний запрос, код, который я разместил здесь, был сгенерирован Postman. Позвольте мне протестировать обновленный код на моем сервере и подтвердить. Вы хотите опубликовать ответ, и я могу выбрать его?

ILG 25.11.2022 11:18
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
8
74
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Во вступлении к этим документам говорится, что

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, а затем записать его в console.info?
Десериализовать JSON в очередь C# пользовательского объекта
Фильтровать объекты JSON на основе переменной массива с несколькими атрибутами в javascript
Как сделать так, чтобы изображения из этого Waifu API отображались на странице?
Разобрать JSON в Powershell
Как объединить два массива объектов, отфильтровывая совпадающие идентификаторы и объединяя объекты с совпадающими идентификаторами по отдельности
Получает ошибку при получении данных из API в Swift: «Ожидается декодирование Dictionary<String, Any>, но вместо этого найден массив»
Редактор Vim показывает некоторые синие символы, но не может до них добраться
Функция React map возвращает одно и то же изображение при отображении случайно сгенерированного URL-адреса изображения
Правильная процедура подключения к сетевой базе данных