求助:基于Alfresco CMIS Atom接口的文档查询实现问题
Alfresco CMIS 查询实现(ColdFusion 版本)
一、CMIS 1.1 接口基础说明
你使用的是Alfresco的CMIS 1.1 AtomPub绑定地址,该接口支持XML和JSON两种请求/响应格式,切换仅需调整请求头:
- XML格式:
Content-Type和Accept设为application/xml - JSON格式:
Content-Type和Accept设为application/json
二、XML 请求修正与ColdFusion 实现
问题排查
你提供的XML查询存在两个潜在问题:
- PATH转义错误:
_x0034_这类Unicode转义字符易导致解析失败,建议替换为实际路径名称(如422替代_x0034_22),或用LIKE替代CONTAINS做路径匹配。 - 冗余查询逻辑:指定精确PATH前缀后,可简化文件名匹配逻辑,避免
CONTAINS的复杂语法。
修正后的XML查询示例
<?xml version='1.0' encoding='UTF-8'?> <cmis:query xmlns:cmis="http://docs.oasis-open.org/ns/cmis/core/200908/"> <cmis:statement>SELECT d.cmis:objectId, d.cmis:name, d.cmis:lastModificationDate FROM cmis:document d WHERE d.cmis:path LIKE '/app:company_home/st:sites/cm:hudocio/cm:documentLibrary/cm:CHUMS/cm:case/422/4223946072/19895-2021-000215/Mitigating - Underwriting/%' AND d.cmis:name = '4223946072-F20D2602-B9E0-4015-A2C0-2470242D2CC7-Gehri - Funding VVOE.pdf'</cmis:statement> <cmis:searchAllVersions>false</cmis:searchAllVersions> <cmis:includeAllowableActions>true</cmis:includeAllowableActions> <cmis:includeRelationships>none</cmis:includeRelationships> <cmis:renditionFilter>cmis:none</cmis:renditionFilter> <cmis:maxItems>1</cmis:maxItems> <cmis:skipCount>0</cmis:skipCount> </cmis:query>
ColdFusion XML请求代码
<cfset alfrescoUrl = "http://<on prem host>:8080/alfresco/api/-default-/public/cmis/versions/1.1/atom/query"> <cfset username = "your-alfresco-username"> <cfset password = "your-alfresco-password"> <cfset queryXml = '<?xml version='1.0' encoding='UTF-8'?> <cmis:query xmlns:cmis="http://docs.oasis-open.org/ns/cmis/core/200908/"> <cmis:statement>SELECT d.cmis:objectId, d.cmis:name, d.cmis:lastModificationDate FROM cmis:document d WHERE d.cmis:path LIKE ''/app:company_home/st:sites/cm:hudocio/cm:documentLibrary/cm:CHUMS/cm:case/422/4223946072/19895-2021-000215/Mitigating - Underwriting/%'' AND d.cmis:name = ''4223946072-F20D2602-B9E0-4015-A2C0-2470242D2CC7-Gehri - Funding VVOE.pdf''</cmis:statement> <cmis:searchAllVersions>false</cmis:searchAllVersions> <cmis:includeAllowableActions>true</cmis:includeAllowableActions> <cmis:includeRelationships>none</cmis:includeRelationships> <cmis:renditionFilter>cmis:none</cmis:renditionFilter> <cmis:maxItems>1</cmis:maxItems> <cmis:skipCount>0</cmis:skipCount> </cmis:query>'> <cfhttp url="#alfrescoUrl#" method="POST" result="cmisResponse"> <cfhttpparam type="header" name="Authorization" value="Basic #toBase64(username & ':' & password)#"> <cfhttpparam type="header" name="Content-Type" value="application/xml"> <cfhttpparam type="header" name="Accept" value="application/xml"> <cfhttpparam type="xml" value="#queryXml#"> </cfhttp> <!-- 解析响应判断文档状态 --> <cfif cmisResponse.statusCode EQ "200 OK"> <cfset responseXml = xmlParse(cmisResponse.fileContent)> <cfset documentExists = structKeyExists(responseXml, "feed") AND arrayLen(responseXml.feed.entry) GT 0> <cfoutput>文档存在状态:#documentExists#</cfoutput> <!-- 提取文档详情 --> <cfloop from="1" to="#arrayLen(responseXml.feed.entry)#" index="i"> <cfset entry = responseXml.feed.entry[i]> <cfoutput> 文档ID:#entry.id.xmlText#<br> 文档名称:#entry.title.xmlText#<br> </cfoutput> </cfloop> <cfelse> <cfoutput>请求错误:#cmisResponse.statusCode# - #cmisResponse.fileContent#</cfoutput> </cfif>
三、JSON 请求格式实现(推荐)
JSON格式请求更简洁,ColdFusion解析也更便捷:
JSON查询请求体
{ "query": "SELECT d.cmis:objectId, d.cmis:name, d.cmis:lastModificationDate FROM cmis:document d WHERE d.cmis:path LIKE '/app:company_home/st:sites/cm:hudocio/cm:documentLibrary/cm:CHUMS/cm:case/422/4223946072/19895-2021-000215/Mitigating - Underwriting/%' AND d.cmis:name = '4223946072-F20D2602-B9E0-4015-A2C0-2470242D2CC7-Gehri - Funding VVOE.pdf'", "searchAllVersions": false, "includeAllowableActions": true, "includeRelationships": "none", "renditionFilter": "cmis:none", "maxItems": 1, "skipCount": 0 }
ColdFusion JSON请求代码
<cfset alfrescoUrl = "http://<on prem host>:8080/alfresco/api/-default-/public/cmis/versions/1.1/json/query"> <cfset username = "your-alfresco-username"> <cfset password = "your-alfresco-password"> <cfset queryJson = '{ "query": "SELECT d.cmis:objectId, d.cmis:name, d.cmis:lastModificationDate FROM cmis:document d WHERE d.cmis:path LIKE ''/app:company_home/st:sites/cm:hudocio/cm:documentLibrary/cm:CHUMS/cm:case/422/4223946072/19895-2021-000215/Mitigating - Underwriting/%'' AND d.cmis:name = ''4223946072-F20D2602-B9E0-4015-A2C0-2470242D2CC7-Gehri - Funding VVOE.pdf''", "searchAllVersions": false, "includeAllowableActions": true, "includeRelationships": "none", "renditionFilter": "cmis:none", "maxItems": 1, "skipCount": 0 }'> <cfhttp url="#alfrescoUrl#" method="POST" result="cmisResponse"> <cfhttpparam type="header" name="Authorization" value="Basic #toBase64(username & ':' & password)#"> <cfhttpparam type="header" name="Content-Type" value="application/json"> <cfhttpparam type="header" name="Accept" value="application/json"> <cfhttpparam type="body" value="#queryJson#"> </cfhttp> <!-- 解析JSON响应判断文档状态 --> <cfif cmisResponse.statusCode EQ "200 OK"> <cfset responseData = deserializeJson(cmisResponse.fileContent)> <cfset documentExists = structKeyExists(responseData, "objects") AND arrayLen(responseData.objects) GT 0> <cfoutput>文档存在状态:#documentExists#</cfoutput> <!-- 提取文档详情 --> <cfloop from="1" to="#arrayLen(responseData.objects)#" index="i"> <cfset doc = responseData.objects[i].object> <cfoutput> 文档ID:#doc.properties['cmis:objectId'].value#<br> 文档名称:#doc.properties['cmis:name'].value#<br> 最后修改时间:#doc.properties['cmis:lastModificationDate'].value#<br> </cfoutput> </cfloop> <cfelse> <cfoutput>请求错误:#cmisResponse.statusCode# - #cmisResponse.fileContent#</cfoutput> </cfif>
四、关键注意事项
- 权限验证:必须添加Basic Auth请求头,使用Alfresco有效账号密码。
- 路径准确性:若路径转义出错,可通过Alfresco节点浏览器获取正确的CMIS路径。
- 查询优化:避免
SELECT *,仅指定需要的字段;设置maxItems=1减少响应数据量。 - 错误排查:报错时直接查看响应内容,Alfresco会返回具体CMIS错误代码与原因(如权限不足、路径不存在等)。
内容的提问来源于stack exchange,提问作者Keith Fosberg
相关产品推荐
相关产品推荐

