APIs Explorer的Firestore projects.databases.documents.list接口正则校验异常
projects.databases.documents.list 接口校验规则缺陷说明 摘要:APIs Explorer 提供的projects.databases.documents.list接口的“试用此API”功能,似乎对parent参数设置了过于严格/错误的正则校验规则,同时对collectionId参数存在不合理的必填要求。
由于gcloud firestore和firebase firestore均未提供集合列表查询功能,我计划开发一个简单工具实现该需求。
和往常一样,我先通过使用体验较好的APIs Explorer调研相关API方法,但发现projects.databases.documents.list的“试用此API”功能对parent参数的正则校验规则似乎过于严格甚至存在错误。
官方文档明确说明接口规则如下:
https://firestore.googleapis.com/v1/{parent=projects/*/databases/*/documents/*/**}/{collectionId}
同时对参数的说明为:
必填项,父资源名称,支持两种格式:
projects/{project_id}/databases/{database_id}/documentsprojects/{project_id}/databases/{database_id}/documents/{document_path}
示例:projects/my-project/databases/my-database/documents 或 projects/my-project/databases/my-database/documents/chatrooms/my-chatroom
但我使用谷歌给出的第一种格式示例projects/my-project/databases/my-database/documents时,接口调用失败:
APIs Explorer仅接受第二种格式的parent参数值,且强制要求填写collectionId参数,而该参数在部分场景下并非必填项:
APIs Explorer会将collectionId拼接在parent后生成请求URL。当parent以/documents结尾(该格式当前不被APIs Explorer允许)时,拼接后可访问chatrooms集合;当parent以/documents/chatrooms/my-chatroom结尾时,可查询该文档下的messages子集合。但当前的参数限制导致无法通过APIs Explorer查询projects/my-project/databases/my-database/documents/chatrooms路径:需要将collectionId设为chatrooms,但对应的父路径projects/my-project/databases/my-database/documents不被APIs Explorer允许输入。
我使用自己的项目(${PROJECT})和(default)作为{database_id},通过curl调用官方示例的格式可正常运行:
TOKEN=$(gcloud auth print-access-token) PROJECT=... PARENT=projects/${PROJECT}/databases/(default)/documents COLLECTION=... curl \ --header "Authorization: Bearer ${TOKEN}" \ --header 'Accept: application/json' \ --write-out '%{response_code}' \ --output /dev/null \ --silent \ https://firestore.googleapis.com/v1/${PARENT}/${COLLECTION} # 返回状态码 200
该API在逐层查询子集合时也可正常工作。
在此发布该问题,希望如果APIs Explorer确实存在此缺陷的话可以尽快修复,避免其他开发者遇到同类问题受阻。
备注:另外我还发现该工具生成的cURL、HTTP、JavaScript示例代码不会根据“API Key”复选框的状态自动调整:当取消勾选“API Key”时,生成的调用代码中仍会携带该参数,不符合预期。
内容的提问来源于stack exchange,提问作者DazWilkin

