什么是Restful?

Rest簡介

  1. REST是英文representational state transfer(表象性狀態轉變)或者表述性狀態轉移。
  2. Rest是web服務的一種架構風格。
  3. 使用HTTP,URI,XML,JSON,HTML等廣泛流行的標準和協議。
  4. 輕量級,跨平臺,跨語言的架構設計。
  5. 它是一種設計風格,不是一種標準,是一種思想。

Rest架構的主要原則

  1. 網絡上的所有事物都被抽象為資源
  2. 每個資源都有一個唯一的資源標識符
  3. 同一個資源具有多種表現形式(xml,json等)
  4. 對資源的各種操作不會改變資源標識符
  5. 所有的操作都是無狀態的
  6. 符合REST原則的架構方式即可稱為RESTful

什么是Restful

  1. 對應的中文是rest式的
  2. Restful web service是一種常見的rest的應用,是遵守了rest風格的web服務
  3. rest式的web服務是一種ROA(The Resource-Oriented Architecture)(面向資源的架構)

為什么會出現Restful

在Restful之前的操作

  1. http://127.0.0.1/user/query GET 根據用戶id查詢用戶數據
  2. http://127.0.0.1/user/save POST 新增用戶
  3. http://127.0.0.1/user/update POST 修改用戶信息
  4. http://127.0.0.1/user/delete GET/POST 刪除用戶信息

Restful用法

  1. http://127.0.0.1/user/1 GET 根據用戶id查詢用戶數據
  2. http://127.0.0.1/user ?POST 新增用戶
  3. http://127.0.0.1/user ?PUT 修改用戶信息
  4. http://127.0.0.1/user ?DELETE 刪除用戶信息

常用的HTTP動詞有下面五個(括號里是對應的SQL命令)

  1. GET(SELECT):從服務器取出資源(一項或多項)。
  2. POST(CREATE):在服務器新建一個資源。
  3. PUT(UPDATE):在服務器更新資源(客戶端提供改變后的完整資源)。
  4. PATCH(UPDATE):在服務器更新資源(客戶端提供改變的屬性)。
  5. DELETE(DELETE):從服務器刪除資源。

如何使用

http方法資源操作冪等安全
GETSELECT
POSTINSERT
PUTUPDATE
DELETEDELETE

冪等性:對同一REST接口的多次訪問,得到的資源狀態是相同的。
安全性:對該REST接口訪問,不會使服務器端資源的狀態發生改變。

##6.SpringMVC原生態的支持了REST風格的架構設計
###所涉及的注解

  1. @RequestMapping
  2. @PathVariable
  3. @ResponseBody
package cn.itcast.mybatis.controller;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;import cn.itcast.mybatis.pojo.User;
import cn.itcast.mybatis.service.NewUserService;@RequestMapping("restful/user")
@Controller
public class RestUserController {@Autowiredprivate NewUserService newUserService;/*** 根據用戶id查詢用戶數據* * @param id* @return*/@RequestMapping(value = "{id}", method = RequestMethod.GET)@ResponseBodypublic ResponseEntity<User> queryUserById(@PathVariable("id") Long id) {try {User user = this.newUserService.queryUserById(id);if (null == user) {// 資源不存在,響應404return ResponseEntity.status(HttpStatus.NOT_FOUND).body(null);}// 200// return ResponseEntity.status(HttpStatus.OK).body(user);return ResponseEntity.ok(user);} catch (Exception e) {e.printStackTrace();}// 500return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);}/*** 新增用戶* * @param user* @return*/@RequestMapping(method = RequestMethod.POST)public ResponseEntity<Void> saveUser(User user) {try {this.newUserService.saveUser(user);return ResponseEntity.status(HttpStatus.CREATED).build();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}// 500return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);}/*** 更新用戶資源* * @param user* @return*/@RequestMapping(method = RequestMethod.PUT)public ResponseEntity<Void> updateUser(User user) {try {this.newUserService.updateUser(user);return ResponseEntity.status(HttpStatus.NO_CONTENT).build();} catch (Exception e) {e.printStackTrace();}// 500return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);}/*** 刪除用戶資源* * @param user* @return*/@RequestMapping(method = RequestMethod.DELETE)public ResponseEntity<Void> deleteUser(@RequestParam(value = "id", defaultValue = "0") Long id) {try {if (id.intValue() == 0) {// 請求參數有誤return ResponseEntity.status(HttpStatus.BAD_REQUEST).build();}this.newUserService.deleteUserById(id);// 204return ResponseEntity.status(HttpStatus.NO_CONTENT).build();} catch (Exception e) {e.printStackTrace();}// 500return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);}
}

##7.HTTP相應狀態碼

codeHTTP operationBody ContentsDescription
200GET,PUT資源操作成功
201POST資源,元數據對象創建成功
202POST,PUT,DELETE,PATCHN/A請求已經被接受
204GETN/A操作已經執行成功,但是沒有返回數據
301GETlink資源已被移除
303GETlink重定向
304GETN/A資源沒有被修改
400GET,POST,PUT,DELETE,PATCH錯誤提示(消息)參數列表錯誤(缺少,格式不匹配)
401GET,POST,PUT,DELETE,PATCH錯誤提示(消息)未授權
403GET,POST,PUT,DELETE,PATCH錯誤提示(消息)訪問受限,授權過期
404GET,POST,PUT,DELETE,PATCH錯誤提示(消息)資源,服務未找到
405GET,POST,PUT,DELETE,PATCH錯誤提示(消息)不允許的http方法
409GET,POST,PUT,DELETE,PATCH錯誤提示(消息)資源沖突,或者資源被鎖定
415GET,POST,PUT,DELETE,PATCH錯誤提示(消息)不支持的數據(媒體)類型
429GET,POST,PUT,DELETE,PATCH錯誤提示(消息)請求過多被限制
500GET,POST,PUT,DELETE,PATCH錯誤提示(消息)系統內部錯誤
501GET,POST,PUT,DELETE,PATCH錯誤提示(消息)接口未實現

原文地址:https://blog.csdn.net/chenxiaochan/article/details/73716617

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/212294.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/212294.shtml
英文地址,請注明出處:http://en.pswp.cn/news/212294.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java程序定時器

目錄 1.java定時器原生方法 1.java定時器原生方法 實現每天早上8點執行任務的示例代碼 import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit;public class TimeTest{pub…

汽車網絡安全--關于UN R155認證的思考

1.UN R155概述 2020年6月25日,聯合國頒布了全球首個汽車網絡安全強制性法規 -- UN 155,詳細規定了關于評估網絡安全措施的審核條款、制造商和供應商降低網絡安全風險的方法以及實施風險評估的義務等。 法規適用于與信息安全相關的M類(4輪及以上載客汽車)、N類(四輪載貨汽車)…

SpringBoot項目連接Graylog

直接用logback將控制臺輸出的日志發送到graylog上 1.導入logback依賴 <dependency> <groupId>de.siegmar</groupId> <artifactId>logback-gelf</artifactId> <version>1.1.0</version> </dependency> 2.創建logback-spring.x…

淺談低代碼

低代碼開發是近年來迅速崛起的軟件開發方法&#xff0c;讓編寫應用程序變得更快、更簡單。有人說它是美味的膳食&#xff0c;讓開發過程高效而滿足&#xff0c;但也有人質疑它是垃圾食品&#xff0c;缺乏定制性與深度。你認為低代碼到底是美以下方向僅供參考。味的膳食還是垃圾…

SpringBoot - 四種常見定時器

常見實現方案 Scheduled注解&#xff1a;基于注解Timer().schedule創建任務&#xff1a;基于封裝類Timer線程&#xff1a;使用線程直接執行任務即可&#xff0c;可以與thread、線程池、ScheduleTask等配合使用quartz配置定時器&#xff1a;基于spring的quartz框架 Scheduled注…

golang學習筆記——編寫最簡單的命令行工具

編寫最簡單的命令行工具 用戶輸入bufio 使用go語言編寫最簡單的命令行工具 mkdir hello-cli-demo cd hello-cli-demo # 查看環境變量 go envgo mod初始化 go mod init gitcode.com/m打開vscode&#xff0c;創建main.go package mainimport ("fmt""bufio&qu…

RK3568 CIF和ISP的關聯

1. 引言 在本文檔中&#xff0c;我們將介紹RK3568芯片的CIF&#xff08;Camera Interface&#xff09;和ISP&#xff08;Image Signal Processor&#xff09;模塊。這兩個模塊是RK3568芯片的關鍵組成部分&#xff0c;用于圖像采集和處理。 CIF是一個標準接口&#xff0c;用于…

快速測試 3節點的redis sentinel集群宕機2個節點以后是否仍能正常使用

有同事問我&#xff0c;三個redis sentinel節點&#xff0c;宕機兩個節點以后&#xff0c;是否還能夠正常的通過redis sentinel正常訪問redis的數據。我想了想&#xff0c;理論上是可以的&#xff0c;但是我沒試過&#xff0c;今天有時間就測試了一下。搭建環境和測試代碼的過程…

Java并發(十七)----變量的線程安全分析

1、成員變量和靜態變量是否線程安全 如果它們沒有共享&#xff0c;則線程安全 如果它們被共享了&#xff0c;根據它們的狀態是否能夠改變&#xff0c;又分兩種情況 如果只有讀操作&#xff0c;則線程安全 如果有讀寫操作&#xff0c;則這段代碼是臨界區&#xff0c;需要考慮線…

深入了解Python pydash庫

更多資料獲取 &#x1f4da; 個人網站&#xff1a;ipengtao.com 在數據處理和分析領域&#xff0c;Python一直是一種強大的編程語言。然而&#xff0c;在處理大規模數據集和執行復雜操作時&#xff0c;有時候需要更高效的工具。在本文中&#xff0c;我們將深入探討pydash庫&am…

語義分割 簡介及數據集簡介

參考文章 MS COCO數據集介紹以及pycocotools簡單使用-CSDN博客

[MySQL--進階篇]存儲引擎的體系結構、簡介、特點、選擇

前言 ?Hello!這里是歐_aita的博客。 ?今日語錄&#xff1a;不要在乎別人怎么看你&#xff0c;因為他們根本就沒有時間&#xff0c;他們只關心他們自己。 ?個人主頁&#xff1a;歐_aita ψ(._. )>?個人專欄&#xff1a; 數據結構與算法 MySQL數據庫 存儲引擎 前言MySQL體…

代碼隨想錄算法訓練營第四十一天|343. 整數拆分、96.不同的二叉搜索樹

代碼隨想錄算法訓練營第四十一天|343. 整數拆分、96.不同的二叉搜索樹 整數拆分 343. 整數拆分 文章講解&#xff1a;https://programmercarl.com/0343.%E6%95%B4%E6%95%B0%E6%8B%86%E5%88%86.html 題目鏈接&#xff1a;https://leetcode.cn/problems/integer-break/ 視頻講解…

李宏毅gpt個人記錄

參考&#xff1a; 李宏毅機器學習--self-supervised&#xff1a;BERT、GPT、Auto-encoder-CSDN博客 用無標注資料的任務訓練完模型以后&#xff0c;它本身沒有什么用&#xff0c;GPT 1只能夠把一句話補完&#xff0c;可以把 Self-Supervised Learning 的 Model做微微的調整&am…

32.768KHz時鐘RTC晶振精度PPM值及頻差計算

一個數字電路就像一所城市的交通&#xff0c;晶振的作用就是十字路口的信號燈&#xff0c;因此晶振的品質及其電路應用尤其關鍵。數字電路又像生命體&#xff0c;它的運行就像人身體里的血液流通&#xff0c;它不是由單一的某個器件或器件單元構成&#xff0c;而是由多個器件及…

【Spring Boot 源碼學習】ApplicationListener 詳解

Spring Boot 源碼學習系列 ApplicationListener 詳解 引言往期內容主要內容1. 初識 ApplicationListener2. 加載 ApplicationListener3. 響應應用程序事件 總結 引言 書接前文《初識 SpringApplication》&#xff0c;我們從 Spring Boot 的啟動類 SpringApplication 上入手&am…

如何查詢川菜食材配料的API接口

在當今的美食文化中&#xff0c;菜譜不只是一張簡單的食譜&#xff0c;更是了解美食文化和飲食知識的重要途徑。然而&#xff0c;若沒有準確的食材配料&#xff0c;烹制出的每道菜品都將難以達到完美的味道。因此&#xff0c;為了更好地滿足人們對于菜譜和食譜的需求&#xff0…

C語言習題集(026)

//寫一個函數&#xff0c;輸入一個4位數字&#xff0c;要求輸出這4個 //數字字符&#xff0c;但每兩個數字間空一個空格。如輸入 //1990&#xff0c;應輸出"1 9 9 0"。 /* */ //解答&#xff1a; #include<stdio.h> void change(int a) { if(a/10!0) { chang…

linux權限管理以及shell

1.shell 1.1什么是shell? shell即外殼&#xff0c;是運行在linux系統上的一個腳本語言&#xff0c;包裹在linux內核的外面。我們常說的linux操作系統實際上是linux內核。我們使用的所有指令都是一個個程序&#xff0c;而shell指令就是一個將我們用戶的操作翻譯給linux內核的程…

軟件設計之組合模式

組合模式&#xff1a;將對象組合成樹形結構。 案例&#xff1a;公司管理。一個公司可以分總公司和分公司&#xff0c;無論是總公司還是分公司都有自己的部門&#xff0c;如人力資源管理部門、財務部門。分公司可以建立自己在不同地域的辦事處。請使用組合模式打印出某個公司的…