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.lett...@gmail.com <mailto:m.lett...@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



Reply via email to