客户端发送的请求在语法上是不正确的().+ Spring,RESTClient

Cha*_*kar 8 spring json rest-client

我正在使用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");
       }
Run Code Online (Sandbox Code Playgroud)

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

我的Json对象:

{"taskName":"nothing","taskId":1234,"taskDesc":"什么都没做"}

我也尝试在RESTClient中指定"Content-Type:application/json"但仍然得到相同的错误

Ben*_*den 16

我最近在请求体中使用JSON字符串遇到了类似的情况,并使用了与您类似的Spring设置.在我的情况下,我没有指定一个String参数并自己反序列化,但我让Spring这样做:

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

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

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

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


Kri*_*ris 3

尝试这个

改变

@RequestParam("json") String json
Run Code Online (Sandbox Code Playgroud)

 @RequestBody Task task
Run Code Online (Sandbox Code Playgroud)

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

更改您的控制器方法

@RequestMapping(value = "/addTask", method = RequestMethod.GET)
   public ModelAndView addTask(@RequestParam("json") String json)
Run Code Online (Sandbox Code Playgroud)

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

并将您的网址更改为

http://localhost:8080/Prime/addTask/mytask/233/testDesc
Run Code Online (Sandbox Code Playgroud)