发表于: 2017-10-20 23:36:29
5 697
今日完成:
1)完成增删改查的restFul接口
增加用户: /user POST,
删除用户:/user/id delete
修改用户:/user/id PUT
查询某个用户:/user/id GET
今天又学习了一下restFul,找到了一篇非常好的博客,用于作为restFul设计的指南:http://www.ruanyifeng.com/blog/2014/05/restful_api.html
2)spring对于restFul的支持,首先,必须明确一点,默认情况下,tomcat是无法通过put与delete 发送请求体中数据的。对于删除用户还好,只需要在url上加一个id,但是对于更新用户就会用问题。先看一下我之前的操作:
$.ajax(
{
url:"/user/"+$("#ID_1").val(),
type:'PUT',
async:true,
data:{
"name":$("#name_1").val(),
"qq":$("#qq_1").val(),
"learn_type":$("#learn_type_1").val(),
"school":$("#school_1").val(),
"daily_url":$("#daily_url_1").val(),
"flag":$("#flag_1").val(),
"senior":$("#senior_1").val(),
"source":$("#senior_1").val()
},
success:function(data){
var value=JSON.stringify(data);
$("#con_update").val(value);
}
}
这样后台User根本无法接受到数据
public @ResponseBody Boolean update(@PathVariable Long id,User user){
为了解决这个问题,我今天尝试了一下,有两种方式:
1)通过PUT发送JSON数据
$.ajax(
{
url:"/user/"+$("#ID_1").val(),
type:'PUT',
async:true,
contentType: "application/json; charset=utf-8",
data:JSON.stringify({
"name":$("#name_1").val(),
"qq":$("#qq_1").val(),
"learn_type":$("#learn_type_1").val(),
"school":$("#school_1").val(),
"daily_url":$("#daily_url_1").val(),
"flag":$("#flag_1").val(),
"senior":$("#senior_1").val(),
"source":$("#senior_1").val()
}),
success:function(data){
var value=JSON.stringify(data);
$("#con_update").val(value);
}
}
这其中使用到了与springmvc整合的jackson
对应表现层:
@RequestMapping(value="/{id}",method = RequestMethod.PUT)
//@RequestBody的作用是将前台的json对象映射到User中去
public @ResponseBody Boolean update(@PathVariable Long id,@RequestBody User user){
但是这里面还有一个问题,今天一直困扰我,现在只能认为:jackson不支持前台的字符串转换为Long类型。因为,如果在前台ajax的data中加入“ID”字段,到后台后,会发现ID为null,无法自动映射过来。(希望师兄可以知道这是为什么)
不过,还好,在表现层直接加入了一个
user.setID(id);
直接将url中的id设置进来。
2)第二种方式:通过在web.xml文件中配置
HiddenHttpMethodFilter
这个拦截器,然后在ajax中这样写:
$.ajax(
{
url:"/user/"+$("#ID_1").val(),
type:'POST',
async:true,
data:{
"_method":"PUT",
"name":$("#name_1").val(),
"qq":$("#qq_1").val(),
"learn_type":$("#learn_type_1").val(),
"school":$("#school_1").val(),
"daily_url":$("#daily_url_1").val(),
"flag":$("#flag_1").val(),
"senior":$("#senior_1").val(),
"source":$("#senior_1").val()
},
success:function(data){
var value=JSON.stringify(data);
$("#con_update").val(value);
}
}
不使用json,加入一个“_method”字段,设置为put,提交方式为POST
对应的web.xml
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
它可以将_method中的内容到springmvc中的时候转换为对应的方式。这也支持delete提交的时候转换数据
3)第三种方式:直接在web.xml配置另外一个拦截器
<filter>
<filter-name>HttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
这只对PUT生效,这样的话,就可以将PUT当POST使用了
希望今天的日报可以帮助那些与我有一样疑问的人。
明日任务:
学习svn,好好看看@RequestMpping这个注解,学习jetty,加快进度。
评论