【问题标题】:Getting a RESTful webservice with Spring to understand a JSON-string使用 Spring 获取 RESTful Web 服务以理解 JSON 字符串
【发布时间】:2014-04-22 12:17:52
【问题描述】:

我对使用 Spring 以及所涉及的所有事情都很陌生,但我正在努力解决这个问题。

我正在尝试使用 Spring MVN 和 Gradle 创建服务来理解 JSON 格式的字符串。这一切都是用Java制作的。 但我根本无法让它正常工作。

这个

@RequestMapping(value = "/toggle")
public @ResponseBody String sendCommand(@RequestParam(value="IP") String IP){
//body
}

是我的控制器中的一个方法,但是,当我发送以下 JSON 格式的字符串时

{"IP":"192.168.1.9"}

我仍然收到响应代码 400。

我尝试了不同的变体,其中一个示例使用 @RequestBody 代替,并为 indata 使用了自己的类。还有一个我收到 HttpEntity 的地方,以查看是否正确收到了字符串。虽然正确接收了字符串,但我无法让我的代码“读取”它。

我可以去localhost:8080/toggle,通过HTTP设置变量,比如:

http://localhost:8080/toggle?IP=192.168.1.9

有效。

您会建议在哪里继续进行故障排除? 提前致谢!


编辑: 哇。非常感谢您的快速回复,我原以为有一两天没有回复,但我在几分钟内就得到了您的帮助。我知道这个网站很好,但你很棒,谢谢!

也就是说,我创建了一个名为 Ident 的新类,它只有一个私有 String 变量,带有构造函数、setter 和 getter。 现在我有

@RequestMapping(value = "/toggle")
public @ResponseBody String sendCommand(@RequestBody Ident ident) {
//body
}

我仍然收到 400 发送相同的字符串。

虽然它可以使用@PathVariable,但我想让它工作,因为现在我只是在试验它。它将用于稍后发送的不仅仅是 IP。

我正在使用 @ComponentScan @EnableAutoConfiguration 在主文件中,这可能与某些事情有关 - 它设置错误?

【问题讨论】:

  • 你绝对应该使用@RequestBody。该 JSON 对象是否代表您希望由 Jackson 反序列化的 Java 对象,或者您打算手动解析它?
  • 您是否在服务器上获得堆栈跟踪?你检查过日志吗?
  • 编辑:嗯,格式坏了,我把这个添加到原始问题中。

标签: java json spring rest


【解决方案1】:

您正在混合不同的东西(请求参数和 json 对象)。

为了捕捉已发布的{"IP":"192.168.1.9"},您需要执行以下操作:

@RequestMapping(value = "/toggle")
public @ResponseBody String sendCommand(@RequestBody String json){
   final YourObject yourObject = mapJsonToObject(json);
   final String ip = yourObject.getIp();
//body
}

您还需要创建一个与 json 对应的类并将该 json 映射到该类(使用类似 jackson 的库)。

如果您想放弃创建中间对象(我不建议您这样做,因为它使代码更清晰),您可以使用标准 JDK 方法从 json 字符串中提取 IP

【讨论】:

  • “不需要”使用像 Jackson 这样的库,尽管我同意它更干净。
  • 技术上不需要它是绝对正确的,在这种简单的情况下,开发人员可以轻松地自己创建对象
【解决方案2】:

你的方法应该是这样的,

 @RequestMapping(value = "/toggle/{IP}")
 public @ResponseBody String sendCommand(@PathVariable String IP){
   //body
 }

这里的 IP 是可以容纳任何通过的 IP 的占位符。

你的 URL 请求应该是这样的

http://localhost:8080/toggle/192.168.1.9 // [按照 RESTful URL 原则]

【讨论】:

  • 这行得通,但假设他关心使他的服务成为 RESTful。
  • 这是不正确的。你需要用@PathParam交换@RequestParam
  • 在 Spring MVC 中它是 @PathVariable,而不是 @PathParam
  • 另外需要注意的是,如果您的代码没有使用调试信息编译,您必须在注释中指定路径名:@PathVariable("IP")
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-20
  • 1970-01-01
  • 1970-01-01
  • 2018-10-25
相关资源
最近更新 更多