Php Can';迁移后不执行批处理操作
我最近完成了将我的Parse PHP应用程序迁移到Google云托管的解析服务器的工作。从那时起,像Php Can';迁移后不执行批处理操作,php,json,parse-platform,parse-server,Php,Json,Parse Platform,Parse Server,我最近完成了将我的Parse PHP应用程序迁移到Google云托管的解析服务器的工作。从那时起,像ParseObject::saveAll(),ParseObject::destroyAll()等批处理操作在大多数情况下开始失败。我正在考虑在GitHub上报告这个bug,但我想确保它不仅仅是我的实例 我甚至无法复制: 这段代码和我的应用程序对批处理操作的使用都会在PHP上引发以下类型的异常(在本例中,错误由saveAll引发): 未捕获异常“Parse\ParseException”,消息为“
ParseObject::saveAll()
,ParseObject::destroyAll()
等批处理操作在大多数情况下开始失败。我正在考虑在GitHub上报告这个bug,但我想确保它不仅仅是我的实例
我甚至无法复制:
这段代码和我的应用程序对批处理操作的使用都会在PHP上引发以下类型的异常(在本例中,错误由saveAll引发):
未捕获异常“Parse\ParseException”,消息为“无法路由批处理路径/1/classes/TestObject”
调试表明Parse服务器返回错误代码107,根据这意味着无效的JSON。我不熟悉RESTAPI,但在本例中,发送的数据是
{“请求”:[{“方法”:“POST”,“路径”:“/1/classes/TestObject”,“body”:[]},{“方法”:“POST”,“路径”:“/1/classes/TestObject”,“body”:[]},{“方法”:“POST”,“路径”:“/1/classes/TestObject”,“body”:[]}
这是有效的JSON
批处理操作在迁移之前工作正常。PHP版本是5.6。感谢您的帮助。如果错误可以重现,我将在GitHub上创建一个问题。解决方案是编写
/parse/classes/ClassName
,而不是/1/classes/ClassName
。因此,在迁移之后,位于的文档中所述的详细信息已经过时
!!!这在将来可能会改变!!!请注意这个问题:以防有人还在寻找这个问题,下面是github发布的解决方案 我更深入地研究了一下。事实证明,服务器对它接收的批处理请求的URL进行了一些剥离。具体来说,它会检查您的api前缀(在大多数情况下为
/parse
)是否与发送的内容匹配。对于批处理请求,单个请求不包含此内容,它们最终会导致匹配失败。通过测试你上面的代码,我可以修补它。它是有效的,但我可能会看看我是否能在将来写一个更好的补丁
当前,您需要在两个位置将api前缀作为/your_prefix/
(在大多数情况下,这也是/parse
,但使用您为服务器设置的前缀)进行批量保存和删除,如下所示
ParseObject.php私有静态函数deepSave($target,$useMasterKey=false)
(与/1/前面的位置相同)
foreach($requests as&$r){
$r['path']='/parse/'.$r['path'];
}
ParseObject.php私有静态函数destroyBatch(数组$objects,$useMasterKey=false)
foreach($objects作为$object){
$data[]=[
'方法'=>'删除',
'path'=>'/parse/classes/'.$object->getClassName()./'.$object->getObjectId(),
];
}
随着这两个点的改变,我能够得到批量保存和删除正常运行。我还观察到了您之前遇到的相同问题,只是为了确认。尝试删除“/1”@xissburg谢谢您的回复,但这没有什么区别。我同时删除了“/1”和“/1/”,错误相同。我很困惑到底是什么原因导致了这个错误。如果你写信给我,而不是一般的听众,我自己打开了这个问题,答案就从那里出来了;虽然我已经有一段时间没有查看问题页面了,而且看起来其他人也在使用相同的解决方案。谢谢你提醒我,我以前应该亲自回答的。
...
$o1 = ParseObject::create('TestObject');
$o2 = ParseObject::create('TestObject');
$o3 = ParseObject::create('TestObject');
ParseObject::saveAll([$o1, $o2, $o3]);
ParseObject::destroyAll([$o1, $o2, $o3]);
...