cancel
Showing results for 
Search instead for 
Did you mean: 

Web interface, JSON

grigora
New Contributor II

Hi - does anyone have a customization to the .z.ph handler that would allow the caller to receive JSON data, the same way that adding q.csv to the URL would result in a CSV file being returned from the server? TIA

2 ACCEPTED SOLUTIONS

enlist did the trick, thanks. The following works fine, no need for double .j.j / .j.k

f1:{enlist (`t1`t2)!(([]c1:`a`b`c;c2:1 2 3);([]c1:`d`e`f;c2:4 5 6))}

wget http://localhost:5000/test.json?f1\` -O test.json

q).j.k raze read0`:test.json
t1| +`c1`c2!((,"a";,"b";,"c");1 2 3f)
t2| +`c1`c2!((,"d";,"e";,"f");4 5 6f)

 

View solution in original post

6 REPLIES 6

davidcrossey
Moderator Moderator
Moderator

A quick solution could be utilise something like wget to download the json data instead.

Server

$ q -p 5000 -q
q)show data:([]a:1+til 10;b:10?`4)
a  b
-------
1  milg
2  igfb
3  kaod
4  bafc
5  kfho
6  jecp
7  kfmo
8  lkkl
9  kfif
10 fglg

q)`:html/test.json 0: enlist .j.j data

Client

$ wget http://localhost:5000/test.json
--2023-09-12 10:46:40--  http://localhost:5000/test.json
Resolving localhost (localhost)... 127.0.0.1
Connecting to localhost (localhost)|127.0.0.1|:5000... connected.
HTTP request sent, awaiting response... 200 OK
Length: 193 [application/json]
Saving to: ‘test.json’

test.json                      100%[====================================================>]     193  --.-KB/s    in 0s

2023-09-12 10:46:40 (61.1 MB/s) - ‘test.json’ saved [193/193]

$ q -q
q)first .j.k each read0 `:test.json
a  b
---------
1  "milg"
2  "igfb"
3  "kaod"
4  "bafc"
5  "kfho"
6  "jecp"
7  "kfmo"
8  "lkkl"
9  "kfif"
10 "fglg"

 

Thanks, but that doesn't quite work for my needs. Instead of being able to say http://localhost:5000/.json?callfunc[] and get a JSON, the caller now has to make two requests, one to run the code and save the output on the filesystem, and then another to read the file from html/. And hope there were no requests in between, which can never be guaranteed.

You can do this in one call without saving the table to the filesystem from the client machine, and without needing to tweak the .z.ph (or .h.val) handlers

davidcrossey_0-1694496825237.png

Note, if you run the same URL via the brower you'll see the JSON there, it won't automatically download like CSV files though.

davidcrossey_1-1694496912387.png

Hope this helps, in lieu of more community suggestions 🙏🏻

Thanks, that's good to know. However, it only appears to work with plain tables, not other structures, e.g. dictionary of tables.

f1:{([]c1:`a`b`c;c2:1 2 3)} / works, but you can do the same with CSV

f1:{ (`t1`t2)! (([]c1:`a`b`c;c2:1 2 3);([]c1:`d`e`f;c2:4 5 6)) } / breaks, even though the structure is serializable through JSON

wget http://localhost:5000/test.json?f1[] -O test.json
--2023-09-12 15:27:40-- http://localhost:5000/test.json?f1[]
Resolving localhost (localhost)... 127.0.0.1
Connecting to localhost (localhost)|127.0.0.1|:5000... connected.
HTTP request sent, awaiting response... 400 Bad Request
2023-09-12 15:27:40 ERROR 400: Bad Request.

Try enlisting

davidcrossey_0-1694575083195.png

davidcrossey_1-1694575099968.png

 

enlist did the trick, thanks. The following works fine, no need for double .j.j / .j.k

f1:{enlist (`t1`t2)!(([]c1:`a`b`c;c2:1 2 3);([]c1:`d`e`f;c2:4 5 6))}

wget http://localhost:5000/test.json?f1\` -O test.json

q).j.k raze read0`:test.json
t1| +`c1`c2!((,"a";,"b";,"c");1 2 3f)
t2| +`c1`c2!((,"d";,"e";,"f");4 5 6f)