5 ms·
Yep, the moment I saw that I though "REBOL"! (Actually, I thought of Red, but same idea.) Still, it seems that this is not thought through properly. What sho
by marvy 9y ago
Yep, the moment I saw that I though "REBOL"! (Actually, I thought of Red, but same idea.)
Still, it seems that this is not thought through properly. What should the language do if the server does not return JSON? And can't we basically do this in Python already?
- Mizza 9y agoIt's a trivial example, but the point would be that the stdlib would have the ability to a) Speak flutent HTTP b) Understand Content-Type c) Deserialize to a common format all completely transparently. If the server returned XML or MsgPack, it wouldn't matter, the code would work the same. Ideally, we could imagine this going a step further, and having the language speak REST entirely. Python's requests is a nice prototype, ergonomically speaking, but we can go much further.
- marvy 9y agoUm, what if the server returned, say, a JPEG? Or a plain old HTML webpage, complete with inline CSS and script tags?
- draegtun 9y agoThere is nothing currently built into Rebol stdlib that replicates exactly this. But here's an example of how it could be done... import <json> import <xml> load-*: function [site] [ p: open site content: read p http: query p close p parse http/headers/Content-Type [ "application/json" return (load-json content) | "application/xml" return (load-xml content) ] else [ fail "Content-Type not recognised" ] ] miserlou: load-* https://api.github.com/users/Miserlou print ["My name is" miserlou/name]
- marvy 9y agoIs this hypothetical, or does the stdlib actually have load-json and load-xml?
- draegtun 9y agoAbove works, the <json> & <xml> imports are pulled off this remotely hosted common library - https://github.com/r3n/renclib https://github.com/r3n/renclib You'll need the Ren/C branch of Rebol 3 for this: * repo - https://github.com/metaeducation/ren-c https://github.com/metaeducation/ren-c * pre-built binaries - http://metaeducation.s3.amazonaws.com/index.html http://metaeducation.s3.amazonaws.com/index.html
- marvy 9y agoOkay, as someone who doesn't know REBOL, what is the effect of miserlou/name if the server returns XML? The string value of a top-level <name> tag?
- draegtun 9y agoAh this was a different XML module than I was thinking of because this is complete DOM parser!! But even so it does produce (by default) a flat representation of the XML. So, if for example, Github did return XML and it looked something like this (shown in Rebol console): >> x: load-xml {<root><name>Mr Miserlou</name><login>xxx</login></root>} == [ <root> [ <name> "Mr Miserlou" <login> "xxx" ] ] So to get top-level tags it's just: >> second x == [ <name> "Mr Miserlou" <login> "xxx" ] Now load-json also has a flat option so that a good way to unify things. Here's an updated example showing this: import <json> import <xml> load-*: function [site] [ p: open site content: read p http: query p close p data: parse http/headers/Content-Type [ "application/json" return (load-json/flat content) | "application/xml" return (second load-xml content) ] else [ fail "Content-Type not recognised" ] ;; next 2 lines just turns it into a hashmap so can do: miserlou/name ;; without it could have done: miserlou/<name> ;; for-skip data 2 [data/1: to-word to-string data/1] make map! lock data ] miserlou: load-* https://api.github.com/users/Miserlou print miserlou/name