我希望使用Spring MVC实现REST服务,我在URL "/url/lookup/{jsonparm}"
传递以下对象:
{"url":"http://bubba.com/foo/bar", "max_hops":3}
我尝试了以下内容:
@RequestMapping(value = "/url/lookup/{jsonparam}", method = RequestMethod.GET)
@ResponseBody
public String urlLookup(@PathVariable("jsonparam") String jsonparam) {
// just to see if I can get the parms
logger.debug("urlLookup get request : " + jsonparam.toString());
JSONObject resp = new JSONObject();
return resp.toString(); // return an empty JSONObject for now
}
所以我通过调用
来调用它http://localhost:8080/v1/wsp/url/lookup/%7B%22max_hops%22%3A3%2C%22url%22%3A%22http%3A%2F%2Fbubba.com%2Ffoo%2Fbar%22%7D
没有运气在我的Jetty日志中看到以下内容:
WARNING: No mapping found for HTTP request with URI [/v1/wsp/url/lookup/{"max_hops":3,"url":"http://bubba.com/foo/bar"}] in DispatcherServlet with name 'rest'
注意:
localhost:8080/v1/wsp/
是正确的,我的Servlet和请求映射也是正确的@PathVariable
作为响应者之一感谢。
答案 0 :(得分:2)
您会混淆GET
和POST
方法。
或者:
POST
方法并实际将发布 JSON内容发送到控制器。您可以使用任何REST客户端进行调试,例如。 Chrome浏览器Advanced Rest Client。使用GET
方法(就像您目前一样)。 但是您必须将JSON值作为名为jsonparam
的实际参数传递。因此,您的示例应更改为:
http://localhost:8080/v1/wsp/url/lookup/jsonparam=%7B%22max_hops%22%3A3%2C%22url%22%3A%22http%3A%2F%2Fbubba.com%2Ffoo%2Fbar%22%7D
后者不常见。
修改强>
再看看你的网址,我怀疑你混淆了两个Spring注释:
@PathVariable("jsonparam")
和:@RequestParam("jsonparam")
当您的网址表明需要@RequestParam
时,您正在使用@PathVariable
。
<强> EDIT2:强>
但是,可以在这里阅读:http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/mvc.html#mvc-ann-requestmapping-uri-templates路径变量可以传递任何简单类型的值。我相信JSON不是其中之一,因此也是你的问题。
我强烈建议使用POST
来交换JSON值。但是,如果这不是一个选项,我建议坚持使用GET
方法,@RequestParam
来访问参数值,并像上面更正的示例一样传递JSON值。
答案 1 :(得分:1)
您应该使用@PathVariable而不是@RequestParam:
public String urlLookup(@PathVariable("jsonparam") String jsonparam){
}
因为你有@RequestMapping(value =“/ url / lookup / {jasonparam} ”
你的@RequestMapping值有一个拼写错误。它应该是/ url / lookup / {jsonparam} 而不是{jasonparam}