I am trying to make simple GET request using groovy HTTP request. I am expecting JSON response in this form:
{Records:[]}
So far I have done this in my code:
def getCountries(def cookies) {
if (!cookies) {
println("cookies list is empty!")
return false
}
println("get countries, cookies list: ")
println(cookies)
try{
def http = new HTTPBuilder("https://www.evisitor.hr/test_API/Rest/")
http.request(GET, ContentType.JSON) {
uri.path = "Htz/Country/RecordsAndTotalCount?psize=20&page=1&sort=NameNational%20desc"
headers.Accept = 'application/json'
headers.'User-Agent' = 'Mozilla/5.0 Ubuntu/8.10 Firefox/3.0.4'
String c = cookies.join(";")
println("before appending in header: ")
println(c)
headers.'Set-Cookie' = c
response.success = { respnse, reader ->
String text = resp.entity.content.text
println("text is: " + text)
String contentType = resp.headers."Content-Type"
println("content type is: " + contentType)
if (contentType?.startsWith("application/json")) {
def json = JsonSlurper().parseText(text)
println(json)
println("1")
}
else {
println("2")
}
}
response.failure = { resp, reader ->
println "Failure response: ${resp.status}"
}
}
}catch (groovyx.net.http.HttpResponseException ex) {
println("3")
ex.printStackTrace()
return null
}catch (java.net.ConnectException ex) {
println("4")
ex.printStackTrace()
return null
}
}
and I am always getting this response:
3 | Error groovyx.net.http.ResponseParseException: Not Found | Error at groovyx.net.http.HTTPBuilder.doRequest(HTTPBuilder.java:500) | Error at groovyx.net.http.HTTPBuilder.doRequest(HTTPBuilder.java:441) | Error at groovyx.net.http.HTTPBuilder.request(HTTPBuilder.java:390) | Error at groovyx.net.http.HTTPBuilder$request$0.call(Unknown Source) | Error at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45) | Error at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108) | Error at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:124) | Error at com.manas.evisitor.EvisitorService$$EPpVE4fg.$tt__getCountries(EvisitorService.groovy:175) | Error at com.manas.evisitor.EvisitorService$$DPpVE4fg.$tt__getCountries(Unknown Source) | Error at com.manas.evisitor.EvisitorService.$tt__getCountries(EvisitorService.groovy) | Error at com.manas.evisitor.EvisitorService$_getCountries_closure3$$EPpVE4fg.doCall(EvisitorService.groovy) | Error at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) | Error at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) | Error at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) | Error at java.lang.reflect.Method.invoke(Method.java:606) | Error at org.springsource.loaded.ri.ReloadedTypeInvoker$2.invoke(ReloadedTypeInvoker.java:122) | Error at org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(ReflectiveInterceptor.java:1299) | Error at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90) | Error at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:324) | Error at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1207) | Error at groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:1110) | Error at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1016) | Error at groovy.lang.Closure.call(Closure.java:423) | Error at com.manas.evisitor.EvisitorService$_getCountries_closure3.call(EvisitorService.groovy) | Error at groovy.lang.Closure.call(Closure.java:439) | Error at com.manas.evisitor.EvisitorService$_getCountries_closure3.call(EvisitorService.groovy) | Error at org.codehaus.groovy.grails.orm.support.GrailsTransactionTemplate$2.doInTransaction(GrailsTransactionTemplate.groovy:88) | Error at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:133) | Error at org.codehaus.groovy.grails.orm.support.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:85) | Error at com.manas.evisitor.EvisitorService$$EPpVE4fg.getCountries(EvisitorService.groovy) | Error at com.manas.evisitor.EvisitorService$$DPpVE4fg.getCountries(Unknown Source) | Error at com.manas.evisitor.EvisitorService.getCountries(EvisitorService.groovy) | Error at com.manas.evisitor.EvisitorService$getCountries$0.call(Unknown Source) | Error at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45) | Error at com.manas.evisitor.EvisitorService$getCountries$0.call(Unknown Source) | Error at com.manas.frontdesk.EvisitorController.testevisitor(EvisitorController.groovy:42) | Error at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) | Error at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) | Error at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) | Error at java.lang.reflect.Method.invoke(Method.java:606) | Error at org.springsource.loaded.ri.OriginalClassInvoker.invoke(OriginalClassInvoker.java:47) | Error at org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(ReflectiveInterceptor.java:1299) | Error at org.codehaus.groovy.grails.web.servlet.mvc.MixedGrailsControllerHelper.invoke(MixedGrailsControllerHelper.java:154) | Error at org.codehaus.groovy.grails.web.servlet.mvc.AbstractGrailsControllerHelper.handleAction(AbstractGrailsControllerHelper.java:375) | Error at org.codehaus.groovy.grails.web.servlet.mvc.AbstractGrailsControllerHelper.executeAction(AbstractGrailsControllerHelper.java:252) | Error at org.codehaus.groovy.grails.web.servlet.mvc.AbstractGrailsControllerHelper.handleURI(AbstractGrailsControllerHelper.java:205) | Error at org.codehaus.groovy.grails.web.servlet.mvc.AbstractGrailsControllerHelper.handleURI(AbstractGrailsControllerHelper.java:126) | Error at org.codehaus.groovy.grails.web.servlet.mvc.SimpleGrailsController.handleRequest(SimpleGrailsController.java:72) | Error at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:50) | Error at org.codehaus.groovy.grails.web.servlet.GrailsDispatcherServlet.doDispatch(GrailsDispatcherServlet.java:347) | Error at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870) | Error at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961) | Error at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852) | Error at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) | Error at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837) | Error at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) | Error at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) | Error at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) | Error at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) | Error at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) | Error at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) | Error at grails.plugin.cache.web.filter.PageFragmentCachingFilter.doFilter(PageFragmentCachingFilter.java:198) | Error at grails.plugin.cache.web.filter.AbstractFilter.doFilter(AbstractFilter.java:63) | Error at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344) | Error at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261) | Error at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) | Error at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) | Error at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101) | Error at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) | Error at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) | Error at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101) | Error at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) | Error at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) | Error at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101) | Error at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) | Error at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) | Error at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) | Error at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:486) | Error at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:411) | Error at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:338) | Error at org.codehaus.groovy.grails.web.mapping.UrlMappingUtils.forwardRequestForUrlMappingInfo(UrlMappingUtils.java:178) | Error at org.codehaus.groovy.grails.web.mapping.UrlMappingUtils.forwardRequestForUrlMappingInfo(UrlMappingUtils.java:144) | Error at org.codehaus.groovy.grails.web.mapping.UrlMappingUtils.forwardRequestForUrlMappingInfo(UrlMappingUtils.java:135) | Error at org.codehaus.groovy.grails.web.mapping.filter.UrlMappingsFilter.doFilterInternal(UrlMappingsFilter.java:216) | Error at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) | Error at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) | Error at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) | Error at org.codehaus.groovy.grails.web.servlet.mvc.GrailsWebRequestFilter.doFilterInternal(GrailsWebRequestFilter.java:69) | Error at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) | Error at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) | Error at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) | Error at org.codehaus.groovy.grails.web.filters.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:67) | Error at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) | Error at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) | Error at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) | Error at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) | Error at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) | Error at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344) | Error at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261) | Error at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) | Error at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) | Error at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) | Error at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) | Error at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) | Error at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) | Error at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) | Error at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) | Error at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070) | Error at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611) | Error at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:314) | Error at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) | Error at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) | Error at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) | Error at java.lang.Thread.run(Thread.java:745) | Error Caused by: groovy.json.JsonException: Unable to determine the current character, it is not a string, number, array, or object The current character read is '<' with an int value of 60 Unable to determine the current character, it is not a string, number, array, or object line number 1 index number 0 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> ^ | Error at groovy.json.internal.JsonParserCharArray.decodeValueInternal(JsonParserCharArray.java:216) | Error at groovy.json.internal.JsonParserCharArray.decodeValue(JsonParserCharArray.java:166) | Error at groovy.json.internal.JsonParserCharArray.decodeFromChars(JsonParserCharArray.java:45) | Error at groovy.json.internal.JsonParserCharArray.parse(JsonParserCharArray.java:409) | Error at groovy.json.internal.BaseJsonParser.parse(BaseJsonParser.java:121) | Error at groovy.json.JsonSlurper.parse(JsonSlurper.java:224) | Error at groovyx.net.http.ParserRegistry.parseJSON(ParserRegistry.java:280) | Error at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) | Error at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) | Error at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) | Error at java.lang.reflect.Method.invoke(Method.java:606) | Error at org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(ReflectiveInterceptor.java:1276) | Error at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90) | Error at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:324) | Error at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1207) | Error at groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:1110) | Error at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1074) | Error at groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:1110) | Error at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1016) | Error at groovy.lang.Closure.call(Closure.java:423) | Error at groovy.lang.Closure.call(Closure.java:439) | Error at groovyx.net.http.HTTPBuilder.parseResponse(HTTPBuilder.java:561) | Error at groovyx.net.http.HTTPBuilder.doRequest(HTTPBuilder.java:494) | Error ... 113 more done
I have googled and found out that it’s problem related to groovy and this problem was not occurring before version 2.3.0, like this post is saying.
I tried all answers and hints but none of them helped. What can I do to make my JSON parseable?
Advertisement
Answer
You are trying to fetch data from incorrect URL, see here. Should be:
https://www.evisitor.hr/eVisitorRhetos_API/Rest/Htz/Country/?psize=20&page=1
There’s no test_API part. No page found results in 404 and this answer explains the exception you get.
The script below (with changed URL) works – it gives 401 since I don’t send authentication data:
@Grab(group='org.codehaus.groovy.modules.http-builder', module='http-builder', version='0.7.1')
import groovyx.net.http.HTTPBuilder
import groovyx.net.http.ContentType
import static groovyx.net.http.Method.GET
def http = new HTTPBuilder("https://www.evisitor.hr/eVisitorRhetos_API/Rest/")
http.request(GET, ContentType.JSON) {
uri.path = "Htz/Country/?psize=20&page=1"
headers.Accept = 'application/json'
headers.'User-Agent' = 'Mozilla/5.0 Ubuntu/8.10 Firefox/3.0.4'
response.success = { respnse, reader ->
String text = resp.entity.content.text
println("text is: " + text)
String contentType = resp.headers."Content-Type"
println("content type is: " + contentType)
if (contentType?.startsWith("application/json")) {
def json = JsonSlurper().parseText(text)
println(json)
println("1")
} else {
println("2")
}
}
response.failure = { resp ->
println resp.status
}
}
Also, the API is invalid, the requested response format – Accept header – is application/json and the result is returned in HTML – that’s why http-builder fails – it expects different response format. The eliminate the exception change response.failure closure to:
{ resp ->
println resp.status
}
eliminate the reader param – it will prevent http-builder from parsing the response automatically.