Maybe using json:serialize() rather than serialize?
In general if output:method is set to Json it should be sufficient to return map{} or array{} or alternatively the XML version of a json document without having to explicitly serialize ...
M.
On 01/08/19 14:36, Tim Thompson wrote:
Thank you, Marco. So, the download issue seems to be with XForms (XSLTForms) rather than BaseX. If I do a file upload from a plain HTML form, the file download is triggered correctly. However, even though I have set "application/json" as the Content-Type, the contents of the downloaded file are an escaped string rather than a serialized JSON object: e.g.,
"{\n "key": "value"\n}" Is there a way to produce a properly serialized JSON file for download?
-- Tim A. Thompson Discovery Metadata Librarian Yale University Library
On Thu, Aug 1, 2019 at 3:03 AM Marco Lettere <m.lettere@gmail.com mailto:m.lettere@gmail.com> wrote:
Hi Tim, downloading from a browser when posting a form is usually a bit tricky. For me it always ended up with the creation of an artificial <a ...> element with an href crafted from the form parameters and with an attribute download="filename.ext" added to it. Anyway you could try with returning a "forced" application/octet-stream Content-Type header .... M. On 01/08/19 05:00, Tim Thompson wrote:
Hello, I am posting a JSON doc to a RESTXQ function from XForms and trying to set a Content-Disposition header to trigger a file download. Is this possible to do without first saving the JSON doc as a file? Right now, the RESTXQ function returns the correct headers, but does not force a file download dialog. Thanks in advance! Tim -- Query: xquery version "3.1"; module namespace wrap = "http://example.org/wrap"; declare %rest:path("/wrap") %rest:POST("{$data}") %output:method("json") function wrap:process( $data as node() ) as item()* { let $name := data($data/data/upload/file/@name) let $json := json-to-xml($data/data/upload/file) let $header := ``[attachment; filename="`{$name}`";]`` return ( <rest:response> <http:response status="200" message="OK"> <http:header name="Content-Type" value="application/json"/> <http:header name="Content-Disposition" value="{$header}"/> </http:response> </rest:response>, <map xmlns="http://www.w3.org/2005/xpath-functions"> <map key="Profile"> <array key="resourceTemplates">{$json}</array> <string key="title">Wrapper_Profile</string> <string key="id">Wrapper:Profile:BF2</string> <string key="description">Profile wrapper for resource templates</string> <string key="author">Wrapper</string> <string key="schema">https://ld4p.github.io/sinopia/schemas/0.0.9/profile.json</string> <string key="date">{current-dateTime()}</string> </map> </map> => xml-to-json() => parse-json() => serialize(map {'method': 'json', 'use-character-maps' : map {'/' : '/'}}) ) }; -- Tim A. Thompson Discovery Metadata Librarian Yale University Library