使用resttemplate将json作为请求url传递时,变量值无效

时间:2015-09-23 15:45:41

标签: java json spring rest

我正在使用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);

2 个答案:

答案 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的查询参数。