Properly sending/receiving JSON?

Saturday, 23 December 2017 · 2 messages · last reply 24 Dec 2017
RC
Robert Crews23 Dec 2017 03:57 #

First off, thank you for the fast answer to my previous question.

Now, I'm having trouble understanding how to send JSON to BaseX. Ultimately, I want to send JSON and store it (allowing BaseX to convert it to XML first, of course).

For now, however, I am having trouble just receiving the JSON data. Here's my test XQM file:

module namespace hwxdocs = "urn:com:hortonworks:docs"; declare %rest:POST("{$body}") %rest:path("hello/json") %rest:consumes("application/json") %output:media-type("application/json") function hwxdocs:hello2( $body ) { "Request body: " || $body };

I send data with this command:

curl -iL -X POST \ --header 'Content-Type: application/json' \ --header 'Accept: application/json' \ --data-binary '{"foo":{"bar":"baz"}}' \ http://localhost:8984/hello/json

I expect to get

Request body: {"foo":{"bar":"baz"}}

(I’m assuming I can pass '{"foo":{"bar":"baz”}}’ to json:parse to convert to a BaseX XML that can be stored in the database.) However, instead, I get

Request body: baz

Can someone tell me what my error is?

Thank you, Robert

CG
Christian Grün24 Dec 2017 12:19 #

Hi Robert,

I haven’t run your code. I assume that your RESTXQ code will already give you an XML representation of your JSON data, because, by default, the 'direct' format will be applied [1,2].

The expression…

"Request body: " || $body

…will atomize your body and return it as string. Just remove the string concatenation and return $body, then it will be more obvious what’s going on.

Cheers, Christian

[1] http://docs.basex.org/wiki/RESTXQ#Content_Types [2] http://docs.basex.org/wiki/JSON_Module#Options

Quoted text · Robert Crews · 34 lines
> module namespace hwxdocs = "urn:com:hortonworks:docs"; > declare > %rest:POST("{$body}") > %rest:path("hello/json") > %rest:consumes("application/json") > %output:media-type("application/json") > function hwxdocs:hello2( > $body > ) { > "Request body: " || $body > }; > > I send data with this command: > > curl -iL -X POST \ > --header 'Content-Type: application/json' \ > --header 'Accept: application/json' \ > --data-binary '{"foo":{"bar":"baz"}}' \ > http://localhost:8984/hello/json > > I expect to get > > Request body: {"foo":{"bar":"baz"}} > > (I’m assuming I can pass '{"foo":{"bar":"baz”}}’ to json:parse to convert to a BaseX XML that can be stored in the database.) > However, instead, I get > > Request body: baz > > Can someone tell me what my error is? > > Thank you, > Robert >

⚡Generated with XQuery