REST和RESTFUL
REST是一種架構風格,REST 指的是一組架構約束條件和原則。滿足這些約束條件和原則的應用程序或設計就是 RESTful。其核心是面向資源。

面向操作的URL
/getAllUsers
/getUser?userid=1
/getUser?userid=2
面向資源的URL:
1. URL中不體現操作,即沒有動詞。
2. 每個資源對應不同的URL, /user/1, /user/2
GET /users:列出所有用戶
POST /users:新建一個用戶
GET /user/ID:獲取某個指定用戶的信息
PUT /user/ID:更新某個指定用戶的信息
DELETE /user/ID:刪除某個用戶
復雜一些的URL(注意,URL中的中文涉及URL編碼的問題):
Get /users/{username}/name
Get /users/{username}/{password}/validate
Get /users/2012/10
Rest常用的5個verb
- GET(SELECT):從服務器取出資源(一項或多項)。
- POST(CREATE):在服務器新建一個資源。
- PUT(UPDATE):在服務器更新資源(客戶端提供改變后的完整資源)。
- PATCH(UPDATE):不建議用,因為不是HTTP標準請求,有兼容性問題。
- DELETE(DELETE):從服務器刪除資源。
Http1.2的8種請求,
OPTIONS HEAD GET POST PUT DELETE TRACE CONNECT
ajax提交時,chrome瀏覽器測試結果,GET, POST, DELETE,PUT都支持,
在PUT時,后臺無法獲得參數,解決方法:在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>
~~~
Spring MVC控制器
~~~
@Controller
public class TestRestful {
public List<UserInfo> users = new ArrayList<>();
public TestRestful()
{
UserInfo u1 = new UserInfo();
u1.setUserid(1);
u1.setUsername("feiyy");
u1.setPassword("123");
users.add(u1);
UserInfo u2 = new UserInfo();
u2.setUserid(2);
u2.setUsername("xx");
u2.setPassword("123");
users.add(u2);
UserInfo u3 = new UserInfo();
u3.setUserid(3);
u3.setUsername("yy");
u3.setPassword("123");
users.add(u3);
}
@RequestMapping(value="/users", method=RequestMethod.GET)
@ResponseBody
public List<UserInfo> getAllUsers()
{
return users;
}
@RequestMapping(value="/users", method=RequestMethod.POST)
@ResponseBody
public List<UserInfo> addUser(UserInfo u)
{
users.add(u);
return users;
}
@RequestMapping(value="/user/{id}", method=RequestMethod.PUT)
@ResponseBody
public List<UserInfo> modifyUser(@PathVariable int id, UserInfo u)
{
System.out.println(id);
System.out.println(u.getUserid());
System.out.println(u.getUsername());
for(int i=0; i<users.size();i++)
{
UserInfo item = users.get(i);
if(item.getUserid() == id)
{
item.setUsername(u.getUsername());
}
}
return users;
}
@RequestMapping(value="/user/{id}", method=RequestMethod.DELETE)
@ResponseBody
public List<UserInfo> deleteUser(@PathVariable int id)
{
for(int i=0; i<users.size();i++)
{
UserInfo item = users.get(i);
if(item.getUserid() == id)
{
users.remove(item);
break;
}
}
return users;
}
@RequestMapping(value="/user/{id}", method=RequestMethod.GET)
@ResponseBody
public UserInfo getUserById(@PathVariable int id)
{
for(int i=0; i<users.size();i++)
{
UserInfo item = users.get(i);
if(item.getUserid() == id)
{
return item;
}
}
return null;
}
@RequestMapping(value="/user/{name}", method=RequestMethod.GET)
@ResponseBody
public UserInfo getUserByName(@PathVariable String name)
{
for(int i=0; i<users.size();i++)
{
UserInfo item = users.get(i);
if(item.getUsername().equals(name))
{
return item;
}
}
return null;
}
@RequestMapping(value="/user/{name}/{pass}", method=RequestMethod.GET)
@ResponseBody
public UserInfo getUserByNamePass(@PathVariable String name, @PathVariable String pass)
{
for(int i=0; i<users.size();i++)
{
UserInfo item = users.get(i);
if(item.getUsername().equals(name) && item.getPassword().equals(pass))
{
return item;
}
}
return null;
}
}
~~~
html頁面:
~~~
$("#btn_getall").click(function(){
$.ajax({
url:"/TestSpringMVC/users",
dataType:"json",
success:function(data)
{
console.log(data);
},
error:function(err)
{
console.log(err);
}
});
});
$("#btn_add").click(function(){
$.ajax({
url:"/TestSpringMVC/users",
type:"post",
data:{userid:"4",username:"eee",password:"eee"},
dataType:"json",
success:function(data)
{
console.log(data);
},
error:function(err)
{
console.log(err);
}
});
});
$("#btn_delete").click(function(){
$.ajax({
url:"/TestSpringMVC/user/4",
type:"delete",
dataType:"json",
success:function(data)
{
console.log(data);
},
error:function(err)
{
console.log(err);
}
});
});
$("#btn_update").click(function(){
$.ajax({
url:"/TestSpringMVC/user/1",
type:"put",
data:{userid:"1",username:"feiyuanyuan",password:"123"},
dataType:"json",
success:function(data)
{
console.log(data);
},
error:function(err)
{
console.log(err);
}
});
});
~~~
表單提交時,只支持get和post,解決方法:
1. 配置過濾器
~~~
<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>
~~~
2. 表單加入隱藏屬性_method
~~~
<form action="/TestSpringMVC/user/1" method="post">
<input type="hidden" name="userid" value="1"/>
<input type="text" name="username"/>
<input type="hidden" name="password" value="123"/>
<input type="hidden" name="_method" value="PUT"/>
<button type="submit">表單提交修改</button>
</form>
<form action="/TestSpringMVC/user/1" method="post">
<input type="hidden" name="userid" value="1"/>
<input type="hidden" name="_method" value="DELETE"/>
<button type="submit">表單提交刪除</button>
</form>
~~~