2017-01-20 10 views
1

J'essaie de créer un client api dans groovy en utilisant httpBuilder. Mon api backend renvoie la sortie json avec le type de contenu application/json. Mais quand je mets le type de contenu dans l'objet de httpbuilder au JSON il jette l'erreur Json String invalide.httpbuilder Groovy ResponseParseException Chaîne JSON non valide

static def webServiceRequest(String baseUrl, String path, def data,method=Method.GET,contentType=ContentType.JSON){ 
     try { 
      def ret = null 
      def http = new HTTPBuilder(baseUrl) 
      http.request(method, contentType) { 
       uri.path = path 
       if(method==Method.GET) 
        uri.query = data 
       else 
        body = data 
       headers.'User-Agent' = 'Mozilla/5.0 Ubuntu/8.10 Firefox/3.0.4' 


       response.success = { resp, json -> 
        println "response status: ${resp.statusLine}" 
        ret = json 
        println '--------------------' 
       } 
      } 
      return ret 

     } catch (Exception ex) { 
      ex.printStackTrace(); 
      return null; 
     } 
    } 

la fonction ci-dessus appelle l'API.

def response = webServiceRequest(grailsApplication.config.getProperty ("site.triggerReasons"),'/do/dataquality/FOSAutomation/doAction/',data,Method.GET,ContentType.JSON) 

sortie réelle sur le navigateur avec une application de type de contenu/JSON

{ "status" : "OK", "data" : { "totalTasks" : 0 }, "error" : "" } 

exception stacktrace:

groovyx.net.http.ResponseParseException: OK 
    at groovyx.net.http.HTTPBuilder.doRequest(HTTPBuilder.java:467) 
    at groovyx.net.http.HTTPBuilder.doRequest(HTTPBuilder.java:417) 
    at groovyx.net.http.HTTPBuilder.request(HTTPBuilder.java:366) 
    at groovyx.net.http.HTTPBuilder$request.call(Unknown Source) 
    at com.nnacres.ApiConsumer.webServiceRequest(ApiConsumer.groovy:29) 
    at com.nnacres.ApiConsumer$webServiceRequest.call(Unknown Source) 
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48) 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113) 
    at com.nnacres.taskAllocator.AllocatorService$$EQ8pAKDw.clearTasksService(AllocatorService.groovy:114) 
    at com.nnacres.taskAllocator.AllocatorService$$DQ8pAKDw.clearTasksService(Unknown Source) 
    at com.nnacres.taskAllocator.AllocatorService.clearTasksService(AllocatorService.groovy) 
    at com.nnacres.taskAllocator.AllocatorService$clearTasksService$0.call(Unknown Source) 
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48) 
    at com.nnacres.taskAllocator.AllocatorService$clearTasksService$0.call(Unknown Source) 
    at com.nnacres.taskAllocator.RiAllocatorController.clearTasks(RiAllocatorController.groovy:97) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at org.springsource.loaded.ri.OriginalClassInvoker.invoke(OriginalClassInvoker.java:50) 
    at org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(ReflectiveInterceptor.java:1461) 
    at org.grails.core.DefaultGrailsControllerClass$ReflectionInvoker.invoke(DefaultGrailsControllerClass.java:210) 
    at org.grails.core.DefaultGrailsControllerClass.invoke(DefaultGrailsControllerClass.java:187) 
    at org.grails.web.mapping.mvc.UrlMappingsInfoHandlerAdapter.handle(UrlMappingsInfoHandlerAdapter.groovy:90) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:961) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:895) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:967) 
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:858) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:622) 
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:843) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) 

    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) 

    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) 
    at org.springframework.boot.actuate.autoconfigure.EndpointWebMvcAutoConfiguration$ApplicationContextHeaderFilter.doFilterInternal(Endpo 
intWebMvcAutoConfiguration.java:281) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) 
    at org.springframework.boot.actuate.trace.WebRequestTraceFilter.doFilterInternal(WebRequestTraceFilter.java:115) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) 
    at org.grails.web.servlet.mvc.GrailsWebRequestFilter.doFilterInternal(GrailsWebRequestFilter.java:75) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) 
    at org.grails.web.filters.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:67) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) 
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:121) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) 
    at org.springframework.boot.actuate.autoconfigure.MetricsFilter.doFilterInternal(MetricsFilter.java:103) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:528) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1099) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:670) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1520) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1476) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: net.sf.json.JSONException: Invalid JSON String 
    at net.sf.json.JSONSerializer.toJSON(JSONSerializer.java:143) 
    at net.sf.json.JSONSerializer.toJSON(JSONSerializer.java:103) 
    at net.sf.json.groovy.JsonSlurper.parseText(JsonSlurper.java:80) 
    at groovyx.net.http.ParserRegistry.parseJSON(ParserRegistry.java:248) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(ReflectiveInterceptor.java:1432) 
    at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93) 
    at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325) 
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1215) 
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1082) 
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1024) 
    at groovy.lang.Closure.call(Closure.java:414) 
    at groovy.lang.Closure.call(Closure.java:430) 
    at groovyx.net.http.HTTPBuilder.parseResponse(HTTPBuilder.java:518) 
    at groovyx.net.http.HTTPBuilder.doRequest(HTTPBuilder.java:460) 
    ... 74 more 

la question est à venir lorsque le service je frappe est en PHP. Dans le service PHP, je définis le type de contenu application/json en utilisant header ('Content-Type: application/json');. et puis juste faire écho le résultat dans un contrôleur.

+0

ajouter 'response.failure = {resp -> println resp.statusLine}' et voir ce qu'il produit – injecteer

+0

https://github.com/vahidhedayati/grails-jenkins-plugin/blob/master/grails-app/services /grails/plugin/jenkins/JiraRestService.groovy#L147 def résultat = JSON.parse (json.toString()) – Vahid

+0

votre serveur php ne renvoie évidemment pas 200 'statusCode' – injecteer

Répondre

2

Le problème résidait dans la version de groovy-httpbuilder jar. J'utilisais l'ancienne version (0.5.0-RC2).

compile group: 'org.codehaus.groovy.modules.http-builder', name: 'http-builder', version: '0.5.0-RC2' 

maintenant je changé que le dernier 0.7.1

compile group: 'org.codehaus.groovy.modules.http-builder', name: 'http-builder', version: '0.7.1' 

maintenant son fonctionne bien.