#php #cockpit-cms
Вопрос:
Я пытаюсь обновить записи в своей коллекции с помощью PHP curl, но каждый раз получаю ошибку 404.
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, APP_URL . '/api/collections/save/trigocms?token=' . APP_TOKEN); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_HEADER, ['Content-Type' =gt; 'application/json']); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(['data' =gt; $site])); $output = curl_exec($ch); curl_close($ch);
$site
является ассоциативным массивом с этой структурой:
[ "_id" =gt; "lt;identifiergt;" "active" =gt; true "address" =gt; "lt;some-valuegt;" "key" =gt; "lt;some-valuegt;" ]
вся запись содержит еще несколько полей, но я хочу обновить только эти 3.
Добавление всей записи (с заполнением каждого поля) также не работает.
PUT
и PATCH
методы возвращают ту же ошибку.
Обновить
После некоторой отладки я обнаружил /modules/Collections/Controller/RestApi.php
, что в save
методе $this-gt;module('cockpit)-gt;getUser();
in возвращается false
и $this-gt;param('data', null);
возвращается null
по какой-то неизвестной причине.
Самое загадочное, что $this-gt;param('data', null);
возвращается null
. когда я сбросил весь объект запроса, я вижу, что есть мой json, но он не проанализирован. просто плоская строка json.
Комментарии:
1. Проверьте, что CURLOPT_URL, APP_URL находятся в области действия, и проверьте полный URL-адрес, чтобы убедиться, что ваша конкатенация действительна. Если вы можете скопировать вставку в браузере и посмотреть, возвращается ли 404 как wel.
2. @OliverMGrech
APP_URL
иAPP_TOKEN
константы объявлены в глобальной области и доступны в этом сценарии. Я подозревал ту же причину, но оказалось, что оба они действительны, и объединенный URL-адрес также действителен. После вставки его в браузер появляется ошибка 404.3. мне кажется, что у вас неправильный URL-адрес или кто предоставил вашу конечную точку, дал вам неправильный URL-адрес. Вы не можете исправить это в своем сценарии CURL. Проверьте информацию на стороне сервера (или того, кто несет ответственность)
4. хорошо. Я. cockpit работает на ПК в моей локальной сети. Допустим, его имя хоста таково
random-pc
. Тогда мой URLhttp://random-pc/api/collections/save/trigocms?token=lt;insert_tokengt;
-адрес, и я уверен, что это правильный URL-адрес, потомуhttp://random-pc/api/collection/get/trigocms?token=lt;insert_tokengt;
что возвращает список записей.5. вы используете IP-адрес или имя компьютера / имя хоста? ваш PHP-скрипт работает на сервере Linux или на локальном сервере WAMP или аналогичном?
Ответ №1:
После некоторой обширной отладки я нашел решение.
Моя ошибка была в завитке. Более конкретно в том, как я пытался установить заголовки (глупый я).
Мне пришлось переодеться:
curl_setopt($ch, CURLOPT_HEADER, ['Content-Type' =gt; 'application/json']);
Для:
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);