我想提供一个带文件下载的浏览器,我使用XQuery
设置文件名。在此示例中,我将文件名设置为“ example.txt ”。
输出fiename是:' docmaker ',这不是我想要的。
完成此任务的正确标头配置是什么?
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"),
map:put($context, "Content-Disposition", 'attachment; filename="example.txt"'),
xdmp:set-response-code(200, "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/docmaker/"),$query)), ('unfiltered'))
return $doc//jbasic:Text/text()
}
catch ($e) {
element error { $e/error:message }
}
}
};
答案 0 :(得分:2)
查看文档,REST扩展中支持Content-Disposition标头或任何其他自定义标头:
http://docs.marklogic.com/guide/rest-dev/extensions#id_84661
我也没有看到其他方法。内置文档端点不提供自己的下载功能,并且转换通过相同的框架,因此也不会工作。
我建议提交RFE。这可能对您个人没有帮助(您必须等待下一个版本之一),但将来可能对其他人有用..
<强> **更新** 强>
@ mblakele的建议有效,下面是一个工作示例。我不情愿地推荐它。 add-response-header有效,但是set-response-code没有。 REST-API将覆盖它。将来可能会发生相同的add-response-header调用..
xquery version "1.0-ml";
module namespace ext = "http://marklogic.com/rest-api/resource/download";
declare default function namespace "http://www.w3.org/2005/xpath-functions";
declare namespace roxy = "http://marklogic.com/roxy";
declare namespace xs = "http://www.w3.org/2001/XMLSchema";
declare option xdmp:mapping "false";
declare
%roxy:params("ID=xs:number")
function ext:get(
$context as map:map,
$params as map:map
) as document-node()*
{
map:put($context, "output-types", "application/csv"),
xdmp:add-response-header("Content-Disposition", 'attachment; filename="example.txt"'),
xdmp:set-response-code(300, "OK"),
document {
try {
doc()[1]
} catch ($e) {
element error { $e/error:message }
}
}
};
HTH!
答案 1 :(得分:1)
请尝试直接致电https://docs.marklogic.com/xdmp:add-response-header,而不是致电map:put
。可能无需设置响应代码:除非出现错误,否则默认为200 OK
。
我不确定roxy如何处理$context
项,但我没有看到任何会自动将其转换为响应标头的代码。
答案 2 :(得分:-1)
这看起来像一个Roxy应用程序,不确定是否使用ML Rest扩展。 我会向Roxy网站发帖提问......
http://developer.marklogic.com/code/roxy
或者MarkLogic通用邮件列表。
MarkLogic开发人员讨论
Roxy是开发人员产品,而非官方MarkLogic产品。
如果写一个纯粹的&#34; HTTP应用程序然后您的技术将工作。我不知道你需要什么Roxy的其他功能,你可以使这个特定的端点成为纯HTTP端点而不改变其余的吗?