- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) >
- Java進(jìn)階之走進(jìn)RESTful接口
API (應用程序編程接口) 兩種用法
1.類(lèi)似jar的使用:A軟件將功能打包成組件(功能塊:比如java中的jar),讓B軟件導入直接使用
2.http請求方式:A項目(系統)提供一個(gè)映射方法路徑,B項目(系統)發(fā)起http請求得到對應功能 (應用請求方式)
應用接口:很多情況下,需要把系統的部分功能(組件)作為服務(wù)暴露給外部的其他應用使用,所以就需要把系統中的服務(wù)作為API接口暴露出去,一般分為公共接口和私用接口(公司內部)
前后端分離,字面意思就是 前端+后端分離,傳統的開(kāi)發(fā)模式前后端耦合過(guò)高,不利于維護,一旦前后端任意一方換,不利于開(kāi)發(fā).
優(yōu)點(diǎn):
是一種規范,規范后端編寫(xiě)的邏輯. REST是一種設計API的模式(風(fēng)格),常用JSON數據格式(能被JS直接讀取) , REST只是一種設計風(fēng)格 , 而不是標準
傳統的請求映射方法(接口)設計考慮要點(diǎn):
1.請求路徑 : /employee/list
2.請求方法:GET/POST
3.請求參數: employee對象
4.請求響應值: JsonResult對象
RESTful風(fēng)格接口約束的要點(diǎn):
1.請求路徑: 要求是操作資源(實(shí)體對象:domain)名稱(chēng)復數 /employees
2.請求方式: 使用請求方式替換資源CRUD操作 :POST–新增 ,GET–查詢(xún) ,DELETE–刪除 ,PUT–更新
3.請求參數:跟之前一樣,需求決定
4.請求響應值:跟之前一樣,需求決定,但是建議返回值都是json格式
網(wǎng)絡(luò )上的所有事物都被抽象為資源
restful認為,每個(gè)資源都有自己唯一的資源定位符(URI), 每個(gè)URI都代表了一種資源,以一張圖片為例:圖片有自己的路徑, 所以圖片也是一種資源. 所以URI中不用動(dòng)詞,只用名詞. 一般數據庫的表都是記錄同種的集合,所以為名詞為復數 這就是為什么請求路徑中的操作資源要加 s , 可以不遵循這個(gè)規范(看自己喜歡或者公司規范)
資源狀態(tài)轉換
當我們訪(fǎng)問(wèn)一個(gè)網(wǎng)站,必然代表客戶(hù)端和服務(wù)端間的互動(dòng),這種互動(dòng),會(huì )涉及資源間的狀態(tài)變化,HTTP協(xié)議,是一個(gè)無(wú)狀態(tài)協(xié)議,所以資源的狀態(tài)保存在服務(wù)器中,如果需要改變狀態(tài),需要使用http方法去讓服務(wù)器資源發(fā)生改變.簡(jiǎn)單的說(shuō)就是,對應請求發(fā)生改變
新增 :從無(wú)到有 更新:從某個(gè)狀態(tài)變成另一個(gè)狀態(tài) 刪除 :從有到無(wú)
使用統一接口
REST要求,必須通過(guò)統一的接口來(lái)對資源執行各種操作
員工列表查詢(xún)與員工單個(gè)查詢(xún),使用相同映射路徑" /employees 和相同請求方法:RequestMethod.GET, 導致請求路徑(路徑+請求方法)一樣,報錯 restful提供解決方案:使用參數路徑方法 參數路徑:將參數作為請求路徑的一部分 /employee/{id} 還要加上注解@PathVariable,將id拿到 瀏覽器/postman發(fā)起請求時(shí)使用: http://localhost:8080/employee/1 其中1是id參數值,同時(shí)也是請求路徑的一部分 另外,請求映射方法必須使用@PathVariable 進(jìn)行參數讀取 注意: 如果路徑參數標記與請求參數名不一致時(shí) ,怎么辦? 可以使用@PathVariable("eid") value屬性指定
@Controller public class EmployeeController { @RequestMapping(value = "employees",method = RequestMethod.GET) @ResponseBody public List<Employee> list(){ List<Employee> employees = Arrays.asList(new Employee(1L, "小羅", 22), new Employee(2L, "小軒", 18)); return employees; } @RequestMapping(value = "employees/{id}",method = RequestMethod.GET) @ResponseBody public Employee get(@PathVariable Long id){ List<Employee> employees = Arrays.asList(new Employee(1L, "xxx", 22), new Employee(2L, "qqq", 22)); return employees.get((int) (id-1)); } @RequestMapping(value = "employees",method = RequestMethod.POST) @ResponseBody public Employee save(Employee employee){ employee.setId(1L); return employee ; } @RequestMapping(value = "employees",method = RequestMethod.DELETE) @ResponseBody public JsonResult delete(Long id){ return new JsonResult(true,"刪除成功"); } @RequestMapping(value = "employees",method = RequestMethod.PUT) @ResponseBody public JsonResult update(Long id){ return new JsonResult(true,"更新成功"); } }
參數路徑方法與傳統方式對比
參數路徑方式: 優(yōu)點(diǎn):可以隱藏參數,避免暴露參數,相對安全 缺點(diǎn):如果參數較多,url過(guò)長(cháng) 不建議使用 參數較少選用參數路徑方法
同一資源具有多種表現形式
HTTP請求的頭信息中用Accept和Content-Type字段表現形式
Accept與Content-Type的區別
1.Accept屬于請求頭, Content-Type屬于實(shí)體頭。
2.Accept代表發(fā)送端(客戶(hù)端)希望接受的數據類(lèi)型。Content-Type代表發(fā)送端(客戶(hù)端|服務(wù)器)發(fā)送的實(shí)體數據的數據類(lèi)型。
Accept:application/json :代表客戶(hù)端希望接受得數據類(lèi)型是json類(lèi)型,后臺返回json數據 Content-Type:application/json:代表發(fā)送端發(fā)送數據格式是json,后臺要以這種格式類(lèi)接收前端的數據
刪除,更新操作 $.ajax({ url: 路徑 , type: 類(lèi)型 , data: 參數{id:111}, success:(回調函數)function(data){ } })
<script> $(function () { //查全部 $("#btn1").click(function () { $.get("/employees" ,function (data) { console.log(data); }) }); //查單個(gè) $("#btn2").click(function () { $.get("/employees/1" ,function (data) { console.log(data); }) }); //新增 $("#btn4").click(function () { $.post("/employees" ,{name:"xiao",age:18},function (data) { console.log(data); }) }); //刪除 $("#btn3").click(function () { $.ajax({ url:"/employees", type: "DELETE", data:{id:1}, success:function (data) { console.log(data); } }) }); //更新 $("#btn5").click(function () { $.ajax({ url:"/employees", type: "PUT", data:{id:1}, success:function (data) { console.log(data); } }) }) }) </script>
springMVC默認不支持put請求,需要額外處理put或patch請求方式的過(guò)濾器,Springboot支持
<filter> <filter-name>httpPutFormContentFilter</filter-name> <filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class> </filter> <filter-mapping> <filter-name>httpPutFormContentFilter</filter-name> <servlet-name>springMVC</servlet-name> </filter-mapping>
@GetMapper、@PostMapping、@DeleteMapping、@PutMapping
等價(jià)于 method =RequestMethod.GET|POST|DELETE|PUT
@RestController
等價(jià)于 @Controller +@ResponseBody
@PathVariable
通過(guò) @PathVariable 可以將 URL 中占位符參數綁定到控制器處理方法參數中
URL 中的 {xxx} 占位符可以通過(guò)@PathVariable(“xxx“) 綁定到操作方法的參數中。
@RequestMapping標簽屬性
params :要求請求中必須攜帶指定名稱(chēng)的參數 params="name" :必須攜帶name參數 params="name=xuan" :必須攜帶name參數,并且name=xuan headers :請求頭,限定要處理請求的請求頭信息,只有匹配才會(huì )被方法處理 consume :等價(jià)于Content-Type value/path:映射路徑 method:限定請求的方式
優(yōu)化RESTful規范的 例子代碼
@RestController @RequestMapping("employees") public class EmployeeController { @GetMapping public List<Employee> list(){ List<Employee> employees = Arrays.asList(new Employee(1L, "小羅", 22), new Employee(2L, "小軒", 18)); return employees; } @GetMapping(value = "/{id}") public Employee get(@PathVariable Long id){ List<Employee> employees = Arrays.asList(new Employee(1L, "xxx", 22), new Employee(2L, "qqq", 22)); return employees.get((int) (id-1)); } @PostMapping public Employee save(Employee employee){ employee.setId(1L); return employee ; } @DeleteMapping public JsonResult delete(Long id){ return new JsonResult(true,"刪除成功"); } @PutMapping public JsonResult update(Long id){ return new JsonResult(true,"更新成功"); } }
API接口測試工具
Postman, Insomnia
RESTful開(kāi)發(fā)框架
常見(jiàn)的有 SpringMVC , jersey , play
到此這篇關(guān)于Java進(jìn)階之走進(jìn)RESTful的文章就介紹到這了,更多相關(guān)Java RESTful內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系QQ:712375056 進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。
Copyright ? 2009-2021 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 珠海市特網(wǎng)科技有限公司 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站