如何在春季启动时处理JSON对象的angular的put请求?

时间:2019-06-09 15:41:47

标签: angular rest spring-boot http put

我正在尝试模拟this您使用视频的环境。在这里,他使用this作为后端来存储和检索有角前端的数据。

我想使用Spring Boot做与我支持的事情相同的事情,并从前端(Angular)进行休息呼叫。

我已成功获取GET请求输出。但无法处理PUT请求。

我想将JSON对象发送到服务器,服务器应该使用它执行一些操作。

客户端

我的 Angular代码用于放置JSON对象,如下所示:

服务

updateTodo(todo:Todo):Observable<boolean>{
   return this.http.put<boolean>('http://localhost:8080/udateJsonData',todo,httpOptions);
}
在上述put请求中的

我的 todo 变量的类定义是:

型号

export class Todo{
    id:number;
    title:string;
    completed:boolean;
}

HttpOptions

const httpOptions = {
headers: new HttpHeaders({
 'Content-Type': 'application/json'
  })
}

后端

在服务器端的 spring boot 中。我有一个rest call映射方法,如下所示:

RequestBody(Model)

@XmlRootElement
public class RequestBody {
   @JsonProperty int id;
   @JsonProperty String title;
   @JsonProperty boolean completed;
}

控制器

@RequestMapping(value = "/udateJsonData", method = RequestMethod.PUT)
@Consumes(MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody boolean udateJsonData(RequestBody requestBody) {
  System.out.println(requestBody.title);
  return false;
}

问题是我将系统权限设置为 null
我尝试调试,发现我的 requestBody 本身为空。

任何帮助将不胜感激。 谢谢。

2 个答案:

答案 0 :(得分:1)

我认为您应该在Java中创建一种POJO对象(例如TodoDTO),该对象具有与Angular中相同的结构和类型。

然后您在put方法参数中使用了@RequestBody注释:

@RequestMapping(value = "/udateJsonData", method = RequestMethod.PUT)
@Consumes(MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody boolean udateJsonData(@RequestBody TodoDTO todo) {
    System.out.println(todo.title);
    return false;
}

答案 1 :(得分:0)

使用@RequestBody批注获取数据

@RequestMapping(value = "/udateJsonData", method = RequestMethod.PUT)
@Consumes(MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody boolean udateJsonData(@RequestBody RequestBody requestBody) {
  System.out.println(requestBody.title);
  return false;
}
  

您实际上可以使用 @PutMapping

@PutMapping(value = "udateJsonData", consumes = MediaType.APPLICATION_JSON_VALUE)
public boolean udateJsonData(@RequestBody RequestBody requestBody) {
   System.out.println(requestBody.title);
   return false;
}