Reading Json http response
The http-builder library is pretty useful to create http requests and responses in groovy. I was initially a bit surprised that groovy does not have this functionality built-in and had to import a separate jar.
Anyway I was trying to read a json response from the http-builder project website and the recommended sample did not work for some reason. This post provides a simple alternative.
Original (non-working) code
import groovyx.net.http.* import static groovyx.net.http.ContentType.* import static groovyx.net.http.Method.* def url = "http://www.url.com" def path = "/path/resource" def outputFile = "c:/temp/result.json" def params = [one:1, two:2] def httpBuilder = new HttpBuilder(url) httpBuilder.request(GET, JSON) { uri.path = path uri.query = params //parameters passed to the url -> ?one=1&two=2 headers.'User-Agent' = 'Mozilla/5.0 Ubuntu/8.10 Firefox/3.0.4' response.success = { resp, json -> println resp.statusLine outputFile.withWriter('UTF-8') { out -> out.println json } } }
The above code reads the json file, but if you open the json file in firefox with the JSONView plugin, you may get a “json is invalid” error.
Solution:
The updated solution is to read the response as a text and apply ‘application/json’ content type.
def httpBuilder = new HttpBuilder(url) httpBuilder.request(GET, TEXT) { uri.path = path uri.query = params headers.'User-Agent' = 'Mozilla/5.0 Ubuntu/8.10 Firefox/3.0.4' headers.Accept = 'application/json' response.success = { resp, json -> println resp.statusLine outputFile.withWriter('UTF-8') { out -> out.println json.text } } }
With 1.8.3 release and built-in json support, this seems to be even easier now, though does not seem to be much fine-tuning of response success and failures.
def params = [one:1, two:2, three:3] def paramString = query.collect { "$it.key=$it.value" }.join("&") def url = site + path + "?" + paramString def jsonResult = new URL(url).text