我有一个休息扩展,提出了一个产生文档的计算请求.GET会将文档的文本元素下载为csv。
更新:在代码中查看评论 更新2: 更新的代码包括抛出错误的行 POST将存储一个包含文件名的文档 strlf:get-file-name($ id)函数返回文件名(测试并自行工作)
更新3见下面的工作示例!
declare
%roxy:params("ID=xs:number")
function strlf:get(
$context as map:map,
$params as map:map
) as document-node()*
{
(: this does not work and gives ERROR
let $id := map:get($params,"ID")
let $filename := strlf:get-file-name($id)
:)
map:put($context, "output-types", "application/csv"),
xdmp:add-response-header("Content-Disposition", 'attachment; filename="lijst.csv"'),
xdmp:set-response-code(300, "OK"),
document {
try {
let $id := map:get($params,"ID")
let $query :=
if (fn:empty($id))
then ()
else cts:element-range-query(xs:QName("jbasic:ID"),"=",(fn:number($id)))
for $doc in cts:search(fn:doc(), cts:and-query((cts:directory-query("/app/vertaler/"),$query)), ('filtered'))
return $doc/jbasic:json/jbasic:Text/text()
}
catch ($e) {
element error { $e/error:message }
}
}
};
现在我的问题:如何在每次调用API时更改附件的默认文件名“lijst.csv”以获得自定义文件名(包括csv中行数的计数,例如“ lijst-123.csv“如果有123行)?
实际上文件名已存在于文档中,似乎我无法动态地在标题中设置它?
部署扩展时错误:
ERROR: 400 "Bad Request"
ERROR: <rapi:error xmlns:rapi="http://marklogic.com/rest-api"><rapi:status-code>400</rapi:status-code><rapi:status>Bad Request</rapi:status><rapi:message-code>RESTAPI-INVALIDCONTENT</rapi:message-code><rapi:message>RESTAPI-INVALIDCONTENT: (err:FOER0000) Invalid content: invalid vertaler extension: could not parse XQuery extension vertaler; please see the server error log for detail XDMP-UNEXPECTED: (err:XPST0003) Unexpected token syntax error, unexpected QName_; vertaler either is not a valid module or does not provide extension functions (delete, get, put, post) in the http://marklogic.com/rest-api/resource/vertaler namespace</rapi:message></rapi:error>
工作解决方案:
declare
%roxy:params("ID=xs:number")
function strlf:get(
$context as map:map,
$params as map:map
) as document-node()*
{
map:put($context, "output-types", "application/csv"),
let $id := map:get($params,"ID")
let $fn := strlf:get-file-name($id)
return xdmp:add-response-header("Content-Disposition", fn:concat('attachment; filename="',$fn,'"')),
xdmp:set-response-code(300, "OK"),
document {
try {
let $id := map:get($params,"ID")
let $query :=
if (fn:empty($id))
then ()
else cts:element-range-query(xs:QName("jbasic:ID"),"=",(fn:number($id)))
for $doc in cts:search(fn:doc(), cts:and-query((cts:directory-query("/app/vertaler/"),$query)), ('filtered'))
return $doc/jbasic:json/jbasic:Text/text()
}
catch ($e) {
element error { $e/error:message }
}
}
};
答案 0 :(得分:1)
你的意思是:
let $count := xdmp:estimate(cts:search(...))
return
xdmp:add-response-header("Content-Disposition", fn:concat('attachment; filename="list', $count, '.csv"'))
更新
您尝试似乎缺少需要遵循let语句的return语句。请注意,逗号分隔函数中的语句。我建议将let一行向下移动(到第一个map下面:put),然后在它们之后添加'return',大致如下:
map:put($context, "output-types", "application/csv"),
let $id := map:get($params,"ID")
let $filename := strlf:get-file-name($id)
return
xdmp:add-response-header("Content-Disposition", 'attachment; filename="lijst.csv"'),
...
HTH!