Запрос cURL PUT с API Nextcloud / owncloud

Я попытался обновить существующего пользователя Nextcloud через их API. Когда я делаю это напрямую через оболочку, это работает

curl -u user:pass -X PUT "https://example.org/ocs/v1.php/cloud/users/admin" -H "OCS-APIRequest: true" -d key="quota" -d value="5GB"

Но когда я пытаюсь сделать это через PHP со следующим кодом, он всегда возвращает «сбой 997»

$url = 'https://' . $ownAdminname . ':' . $ownAdminpassword . '@example.org/ocs/v1.php/cloud/users/admin';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$fields = array("quota" => "5GB");
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($fields));
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'OCS-APIRequest: true'
    ));
$response = curl_exec($ch);
curl_close($ch);
echo "Response: ".$response;

person Johannes    schedule 15.11.2017    source источник
comment
Вы не включаете value во второй. Вы должны указать, какой ответ вы получаете.   -  person Evert    schedule 16.11.2017
comment
Я делаю ( $fields = array("quota" => "11GB")) ), это просто немного вводит в заблуждение, что я использую 5 ГБ в первом примере и 11 ГБ во втором   -  person Johannes    schedule 16.11.2017


Ответы (1)


Разница между командой cURL и вставленным кодом PHP заключается в плохо спроектированный API синхронизации пользователей.

Используя эти аргументы cURL:

-d key="quota" -d value="5GB"

... не эквивалентен полям, которые вы публикуете:

$fields = array("quota" => "5GB");

... скорее:

$fields = array(
    'key' => 'quota',
    'value' => '5GB',
);

Объяснение кода 997, который вы получаете, можно найти в https://github.com/owncloud/core/blob/v10.0.3/apps/provisioning_api/lib/Users.php#L269-L272.: так как нет "key" ключ в отправленных данных ($parameters['_put']['key'] будет оцениваться как null) и, следовательно, ошибка.

person Alfageme    schedule 16.11.2017