我正在使用spring resttemplate类消费休息webservice是我的url,由第三方应用程序供应商提供
[http://10.123.84.143:8080/ServiceWebService/updateModelMPData.do?lmgCode=186353&applicationId=8&uuid=9a26038f-6dd1-40b6-b847-f2fd16366fc0&jsonData={No. of Organizations -: 1,No. of officals -: 20,No. of Ers -: 5}
所以根据他的要求我需要动态传递json值,就像我上面提到的1,20,5我是从数据库得到的,我正在通过。当我使用resttemplate交换方法执行时,以及我传递的所有参数我得到以下异常
EXCEPTION -------------------
中的变量值无效[http://10.123.84.143:8080/ServiceWebService/updateModelMPData.do?lmgCode=186353&applicationId=8&uuid=9a26038f-6dd1-40b6-b847-f2fd16366fc0&jsonData={No. of Organizations -: 1,No. of officals -: 20,No. of Ers -: 5}: expected 1; got 0
java.lang.IllegalArgumentException: Invalid amount of variables values in [http://10.123.84.143:8080/ServiceWebService/updateModelMPData.do?lmgCode=186353&applicationId=8&uuid=9a26038f-6dd1-40b6-b847-f2fd16366fc0&jsonData={No. of Organizations -: 1,No. of officals -: 20,No. of Ers -: 5}: expected 1; got 0
at org.springframework.web.util.UriTemplate.expand(UriTemplate.java:127)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:400)
at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:377)
at com.org.ep.trg.webservice.ModelGPStatusController.GpStatusSubmit(ModelGPStatusController.java:92)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:436)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:424)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:669)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:585)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at in.nic.pes.common.interceptor.AUthenticatUserFilter.doFilter(AUthenticatUserFilter.java:23)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at com.org.ep.help.HelpFilter.doFilter(HelpFilter.java:74)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at com.org.ep.interceptor.NoCacheFilter.doFilter(NoCacheFilter.java:37)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
at org.apache.catalina.authenticator.SingleSignOn.invoke(SingleSignOn.java:309)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:999)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:565)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)
这里我的疑问是如何在url中动态传递json值,以及哪种方法是使用resttemplate使用rest服务的最佳选择。 这里还有一件事是我没有看到其余的服务方法实现方法,我只知道上面提到的url 谢谢你查看我的查询。
这是我的代码,它导致我的控制器类
中的异常 ResponseEntity<ModelStatusEntity> result = restTemplate.exchange(uri, HttpMethod.POST, null, ModelStatusEntity.class);
答案 0 :(得分:1)
RestTemplate
,在发出请求之前,使用任何给定的uri变量扩展给定的URI(可能包含URI模板变量)。
模板变量的语法部分在URITemplate
javadoc。
URI模板是一个类似URI的字符串,其中包含变量 通过大括号({}),可以扩展它以产生实际的URI。
在你的URI中,你有这个小块
jsonData={No. of Organizations -: 1,No. of officals -: 20,No. of Ers -: 5}
注意{..}
括号。其中的所有内容都被解释为URI模板变量。但是您没有提供任何URI变量来解决它。再次注意它是如何陈述的
预计1;得到0
我建议的解决方案是将JSON(真正的JSON,而不是你试图在那里使用的)添加到正文中。其他解决方案是编码(转义){}
,以便它们不被解释为URI模板变量。
答案 1 :(得分:0)
此字符串不 JSON:
{No. of Organizations -: 1,No. of officals -: 20,No. of Ers -: 5}
JSON将是:
{NoOfOrganizations: 1, NoOfOfficals: 20, NoOfErs 5}
您无法使用JSON解析非JSON字符串。您必须自己解析,或更改另一侧以生成实际的JSON。
此外,查询参数是未编码的。编码将是:
%7BNo.%20of%20Organizations%20-%3A%201%2CNo.%20of%20officals%20%20-%3A%2020%2CNo.%20of%20Ers%20%20-%3A%205%7D
正如其他人所评论的那样,您不应该将JSON文本作为查询参数发送。 URL的长度有限,低至2000,因此当值很长时,值应该在POST的主体中发送,而不是作为GET的查询参数。