(Exist 4.4, XQuery 3.1)
Я предлагаю пользователю возможность загружать PDF-документы, которые динамически создаются в момент запроса. Запрос имеет два параметра: имя документа (например, doc=MS609-0002.pdf
) и версию на языке документа (например, lang=EN
).
Функция, которая выводит данные, находится в download.xql
:
declare function download:download($node as node(), $model as map(*), $doc as xs:string, $lang as xs:string)
{
...
return response:stream-binary($pdf,"application/pdf", $filename)
}
Он выводит штраф PDF как при прямом вызове в среде IDE, так и при вызове функции через HTML-шаблон eXist, например:
http://localhost:8081/exist/apps/deheresi/download?doc=MS609-0002.pdf&lang=EN
Однако использование HTML означает открытие другого окна браузера.
Вместо этого я хотел бы запросить REST GET с помощью кнопки. Я просмотрел документацию eXist REST и могу не заставить его работать.
Согласно документации, я должен выпустить GET со следующей структурой:
http://localhost:8081/exist/rest/db/deheresi/download.xql?doc=MS609-0002.pdf&lang=EN
Но когда я делаю этот запрос, я получаю:
HTTP ERROR 404
Problem accessing /exist/rest/db/deheresi/download.xql.
Reason: Document /db/deheresi/download.xql not found
Этот вариант с /exist/rest/apps/
: http://localhost:8081/exist/rest/apps/deheresi/download.xql?doc=MS609-0002.pdf&lang=EN
Возвращает следующее сообщение с пустым деревом:
This XML file does not appear to have any style information associated with it. The document tree is shown below.
И этот вариант с /exist/db/apps/
: http://localhost:8081/exist/db/apps/deheresi/download.xql?doc=MS609-0002.pdf&lang=EN
Возврат:
XQueryServlet Error
Error found
Message: Cannot read source file
/Applications/eXist-db.app/Contents/Resources/eXist-db/webapp/db/apps/deheresi/download.xql
Я проверил права доступа к файлам, и, похоже, проблем нет. Хотя может быть требование разрешения / конфигурации REST, о котором я не знаю? Есть ли проблемы с REST на localhost
?
РЕДАКТИРОВАТЬ: это полная функция, которая должна обрабатывать запрос REST:
xquery version "3.1";
module namespace get="/db/apps/deheresi/modules/download”;
declare namespace templates="http://exist-db.org/xquery/templates";
declare namespace tei="http://www.tei-c.org/ns/1.0";
declare namespace xsl = "http://www.w3.org/1999/XSL/Transform";
import module namespace xslfo = "http://exist-db.org/xquery/xslfo";
import module namespace document="/db/apps/deheresi/modules/document" at "/db/apps/deheresi/modules/document.xql";
import module namespace document-view="/db/apps/deheresi/modules/document-view" at "/db/apps/deheresi/modules/document-view.xql";
import module namespace document-preprint="/db/apps/deheresi/modules/document-preprint" at "/db/apps/deheresi/modules/document-preprint.xql";
import module namespace document-print="/db/apps/deheresi/modules/document-print" at "/db/apps/deheresi/modules/document-print.xql";
import module namespace functx="http://www.functx.com" at "/db/apps/deheresi/modules/functx.xql";
import module namespace globalvar="/db/apps/deheresi/modules/globalvar" at "/db/apps/deheresi/modules/globalvar.xqm";
declare function download:download($doc as xs:string?, $lang as xs:string?)
{ (: parse $doc to get name of XML to transform, send back pdf with same name :)
let $docset := upper-case(substring-before($doc,"."))
let $filename := concat($docset,".pdf")
let $document := doc(concat($globalvar:URIdata,concat($docset,".xml")))
let $language := if (lower-case($lang) = "fr")
then lower-case($lang)
else "en"
let $filename := concat($docset,".pdf")
(: get XSLT stylesheet :)
let $fostylesheet := document-print:single-doc-fo-stylesheet($language)
(: get XEP FO config:)
let $config := util:expand(doc("/db/apps/deheresi/xep.xml")/*)
(: get xml for transformation in correct language :)
let $xml := document-preprint:single-doc-preprint($document, $language)
(: create FO xml :)
let $fo := util:expand(transform:transform($xml, $fostylesheet, ()))
(: render pdf :)
let $pdf := xslfo:render($fo, "application/pdf", (), $config)
return response:stream-binary($pdf,"application/pdf", $filename)
};
NB: Я назначил награду за это в надежде получить ответ, который проходит через функцию ввода и вывода REST с примером получения спонтанно сгенерированного PDF-файла. Сюда входят любые проблемы с конфигурацией / разрешениями, которые могут повлиять на запрос REST.