Не удается выполнить пакетные операции после миграции

Недавно я завершил миграцию моего приложения Parse PHP на сервер Parse, размещенный в облаке Google. С тех пор пакетные действия, такие как ParseObject::saveAll(), ParseObject::destroyAll() и т. д., в большинстве случаев перестали работать. Я думаю сообщить об этом как об ошибке на GitHub, но я хочу убедиться, что это не только мой экземпляр.

Я даже не могу воспроизвести тест GitHub PHP SDK код для destroyAll:

...
$o1 = ParseObject::create('TestObject');
$o2 = ParseObject::create('TestObject');
$o3 = ParseObject::create('TestObject');
ParseObject::saveAll([$o1, $o2, $o3]);
ParseObject::destroyAll([$o1, $o2, $o3]);
...

И этот код, и мое приложение, использующее пакетные действия, вызывают следующее исключение в PHP (в этом примере ошибка вызывается saveAll):

Неперехваченное исключение «Parse\ParseException» с сообщением «невозможно маршрутизировать пакетный путь /1/classes/TestObject»

Отладка показывает, что сервер Parse возвращает код ошибки 107, который согласно документация означает неверный JSON. Я не знаком с REST API, но для этого примера отправленные данные

{"запросы":[{"метод":"POST","путь":"/1/классы/TestObject","тело":[]},{"метод":"POST","путь":" /1/classes/TestObject","body":[]},{"method":"POST","path":"/1/classes/TestObject","body":[]}]}

Что является допустимым JSON.

Пакетные действия работали правильно до миграции. Версия PHP 5.6. Любая помощь приветствуется. Если ошибку удастся воспроизвести, я создам задачу на GitHub.


person lipusal    schedule 03.03.2016    source источник
comment
Попробуйте удалить /1   -  person xissburg    schedule 04.03.2016
comment
@xissburg Спасибо за ответ, но это ничего не изменило. Я удалил и /1, и /1/, и ошибка та же. Я в тупике, что может быть причиной ошибки.   -  person lipusal    schedule 05.03.2016


Ответы (2)


Решение состояло в том, чтобы написать /parse/classes/ClassName вместо /1/classes/ClassName. Итак, после миграции детали, указанные в документации по адресу https://parse.com/docs/rest/guide, устарели.

!!! это может измениться в будущем!!! следите за этой проблемой: https://github.com/ParsePlatform/parse-php-sdk/issues/229

person Mathijs    schedule 30.05.2016
comment
На случай, если вы писали мне, а не широкой публике, я сам открыл этот вопрос, и ответ пришел оттуда; хотя я давно не проверял страницу проблемы, и похоже, что другие используют то же решение. Спасибо за наводку, должен был ответить сам раньше. - person lipusal; 31.05.2016

На всякий случай, если кто-то все еще ищет это, вот решение, опубликованное на github.

Я копался в этом немного больше. Оказывается, сервер выполняет некоторую зачистку URL-адресов, которые он получает для пакетных запросов. В частности, он проверяет, соответствует ли ваш префикс API (в большинстве случаев /parse) тому, что было отправлено. В пакетных запросах отдельные запросы не содержат это, и в конечном итоге они не соответствуют этому совпадению. Проверив код, который вы разместили выше, я смог его исправить. Это работает, но я, вероятно, посмотрю, не смогу ли я написать лучший патч в будущем.

В настоящее время вам нужно добавить префикс API в виде /your_prefix/ (опять же, в большинстве случаев это /parse, но используйте тот, который вы настроили для своего сервера) в двух местах для пакетного сохранения и удаления следующим образом.

ParseObject.php private static function deepSave($target, $useMasterKey = false) (там же, где стоит /1/)

foreach ($requests as &$r) {
    $r['path'] = '/parse/' . $r['path'];
}

ParseObject.php private static function destroyBatch(array $objects, $useMasterKey = false)

foreach ($objects as $object) {
    $data[] = [
        'method' => 'DELETE',
        'path'   => '/parse/classes/'.$object->getClassName().'/'.$object->getObjectId(),
    ];
}

Изменив эти два места, я смог правильно запустить пакетное сохранение и удаление. Я также заметил ту же проблему, что и раньше, просто для подтверждения.

person montymxb    schedule 17.06.2016