【问题标题】:The request sent by the client was syntactically incorrect ().+Spring , RESTClient客户端发送的请求语法错误 ().+Spring , RESTClient
【发布时间】:2012-12-21 22:24:46
【问题描述】:

我正在使用 JSON 对象处理 Spring MVC。当我试图从 RESTClient 发送 JSON 对象时,我得到了

HTTP 状态 400 - 客户端发送的请求在语法上不正确 ()。

这是我的控制器

ObjectMapper mapper=new ObjectMapper();
@RequestMapping(value = "/addTask", method = RequestMethod.GET)
       public ModelAndView addTask(@RequestParam("json") String json) throws JsonParseException, JsonMappingException, IOException 
       {
          System.out.println("Json object from REST : "+json);
          Task task=(Task) mapper.readValue(json, Task);
          service.addService(task);
          return new ModelAndView("Result");
       }

我的请求网址:http://localhost:8080/Prime/addTask

我的 Json 对象:

{"taskName":"nothing","taskId":1234,"taskDesc":"nothing doing"}

我也尝试在 RESTClient 中指定“Content-Type: application/json”,但仍然遇到同样的错误

【问题讨论】:

  • 我不确定 Spring 是如何工作的,但是如果您的请求方法是 GET,您不应该请求 URL 是 http://localhost:8080/Prime/addTask?json=%7B%22taskName%22%3A%22nothing%22%2C%22taskId%22%3A1234%2C%22taskDesc%22%3A%22nothing%20doing%22%7D,并在查询字符串中发送 json 参数吗?
  • 我也尝试通过将 json 字符串添加到请求 URL 但仍然显示相同的错误。
  • 您可以使用Fiddler (fiddler2.com/fiddler2/version.asp) 之类的工具来检查请求。也将其发布在问题中,以便其他人可以查看。

标签: json spring rest-client


【解决方案1】:

我最近在请求正文中使用 JSON 字符串遇到了类似的情况,并且使用了与您的非常相似的 Spring 设置。就我而言,我没有指定字符串参数并自己反序列化它,我让 Spring 这样做:

   @RequestMapping(value = "/myService/{id}", method = RequestMethod.POST)
   @ResponseBody
   public void myService(@PathVariable(value = "id") Long id, @RequestBody MyJsonValueObject request) {
   ..
   }

我收到 HTTP 错误 400“客户端发送的请求在语法上不正确”响应。直到我意识到@RequestBody MyJsonValueObject 上没有默认构造函数,所以反序列化它存在问题。但是,这个问题以这种方式呈现。

因此,如果您使用 POST 和对象,并且遇到这样的错误,请确保您有一个默认构造函数!添加一些 JUnit 以确保您可以反序列化该对象。

注意:我并不是说这是您收到此错误的唯一原因。最初的案例只使用了字符串(它确实有一个默认的构造函数!)所以它有点不同。但在这两种情况下,请求 URI 似乎已映射到正确的方法,并且尝试从 HTTP 请求中提取参数时出现问题。

【讨论】:

  • 对我来说就是这样。谢谢。
  • 还保存了我的案例。谢谢!!
  • 为什么我们必须有 POST 的默认构造函数?
【解决方案2】:

试试这个

改变

@RequestParam("json") String json

 @RequestBody Task task

如果你对 POST 方法不感兴趣,你可以试试这个

改变你的控制器方法

@RequestMapping(value = "/addTask", method = RequestMethod.GET)
   public ModelAndView addTask(@RequestParam("json") String json)

@RequestMapping(value = "/addTask/{taskName}/{taskId}/{taskDesc}", method = RequestMethod.GET)
   public ModelAndView addTask(@RequestParam("taskName") String taskName,
@RequestParam("taskId") String taskId,@RequestParam("taskDesc") String taskDesc)

并将您的 URL 更改为

http://localhost:8080/Prime/addTask/mytask/233/testDesc

【讨论】:

  • 感谢您的回复。我试过但没有用。 @RequestBody 也用于 POST 方法。我正在使用 GET 方法
  • @Chandrasekar 我不认为你可以在 get 方法中发送对象
【解决方案3】:

我的问题是由于 @RequestBody 对象的不正确映射。

我的请求正文如下所示

{data: ["1","2","3"]}

我的控制器中有以下代码

@RequestMapping(value = "/mentee", method = RequestMethod.POST)
public @ResponseBody boolean updateData(@RequestBody List<Integer> objDTO, HttpSession session) {
        ...
    }

这给了我 HTTP 400,因为 Spring 不知道如何将我的 Json 数据绑定到列表。

我将 RequestBody 对象更改为以下

@RequestMapping(value = "/mentee", method = RequestMethod.POST)
public @ResponseBody boolean updateData(@RequestBody ObjectiveDto objDTO, HttpSession session) {
        ...
    }

并定义ObjectiveDto如下

@ToString
public class ObjectiveDto {

    @Getter @Setter
    private List<Integer> data;

}

这解决了 HTTP 400 错误。

【讨论】:

    猜你喜欢
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-18
    • 2014-01-04
    • 1970-01-01
    相关资源
    最近更新 更多