RESTframework簡介

来源:https://www.cnblogs.com/gaidy/archive/2018/07/15/9260605.html
-Advertisement-
Play Games

什麼是RESTful? RESTful是一種開發理念,REST是Roy Thomas Fileding在他博文提出的.REST特點;url簡潔,將參數通過url傳遞到伺服器,簡單就是說URL定位資源,用HTTP動詞描述操作. RESTful架構: 每一個URL代表一種資源; 客戶端和伺服器之間,傳遞 ...


 

什麼是RESTful?

RESTful是一種開發理念,REST是Roy Thomas Fileding在他博文提出的.REST特點;url簡潔,將參數通過url傳遞到伺服器,簡單就是說URL定位資源,用HTTP動詞描述操作.

RESTful架構:

  • 每一個URL代表一種資源;
  • 客戶端和伺服器之間,傳遞這種資源的某種表現層;
  • 客戶端通過四個HTTP動詞,對伺服器端資源進行操作,實現"表現層狀態轉化"。
  • URL節後不能含有動詞
  • 一般介面返回的是JSON和XML類型的,JSON一般用的多
  • 定義介面統一,使用起來比較方便

RESTful設計方法:

API介面應該部署到專用的功能變數名稱下,如果API不需要擴展,可以放到主功能變數名稱下,API版本號放到URL中或者放到請求頭信息中,路徑就是表示API的具體網站,每個網站都有對應的資源,API中的名詞應該使用複數,

常見的HTTP的動詞

  • GET(SELECT):從伺服器取出資源(一項或多項)。
  • POST(CREATE):在伺服器新建一個資源。
  • PUT(UPDATE):在伺服器更新資源(客戶端提供改變後的完整資源)。
  • DELETE(DELETE):從伺服器刪除資源。

不常用的HTTP動詞

  • PATCH(UPDATE):在伺服器更新(更新)資源(客戶端提供改變的屬性)。
  • HEAD:獲取資源的元數據。
  • OPTIONS:獲取信息,關於資源的哪些屬性是客戶端可以改變的。

過濾信息

?limit=10:指定返回記錄的數量
?offset=10:指定返回記錄的開始位置。
?page=2&per_page=100:指定第幾頁,以及每頁的記錄數。
?sortby=name&order=asc:指定返回結果按照哪個屬性排序,以及排序順序。
?animal_type_id=1:指定篩選條件

常見的狀態碼

  • 200 OK - [GET]:伺服器成功返回用戶請求的數據
  • 201 CREATED - [POST/PUT/PATCH]:用戶新建或修改數據成功。
  • 202 Accepted - [*]:表示一個請求已經進入後臺排隊(非同步任務)
  • 204 NO CONTENT - [DELETE]:用戶刪除數據成功。
  • 400 INVALID REQUEST - [POST/PUT/PATCH]:用戶發出的請求有錯誤,伺服器沒有進行新建或修改數據的操作
  • 401 Unauthorized - [*]:表示用戶沒有許可權(令牌、用戶名、密碼錯誤)。
  • 403 Forbidden - [*] 表示用戶得到授權(與401錯誤相對),但是訪問是被禁止的。
  • 404 NOT FOUND - [*]:用戶發出的請求針對的是不存在的記錄,伺服器沒有進行操作,該操作是冪等的。
  • 406 Not Acceptable - [GET]:用戶請求的格式不可得(比如用戶請求JSON格式,但是只有XML格式)。
  • 410 Gone -[GET]:用戶請求的資源被永久刪除,且不會再得到的。
  • 422 Unprocesable entity - [POST/PUT/PATCH] 當創建一個對象時,發生一個驗證錯誤。
  • 500 INTERNAL SERVER ERROR - [*]:伺服器發生錯誤,用戶將無法判斷發出的請求是否成功。

返回處理

  • GET /collection:返回資源對象的列表(數組)
  • GET /collection/resource:返回單個資源對象
  • POST /collection:返回新生成的資源對象
  • PUT /collection/resource:返回完整的資源對象
  • PATCH /collection/resource:返回完整的資源對象
  • DELETE /collection/resource:返回一個空文檔

超媒體(Hypermedia API)

github(api.github.com)

訪問第一個

 

Django開發REST介面

 一個簡單的REST介面案例

# 路由
urlpatterns = [
    url(r'^games/$', views.GamesAPIView.as_view()),
    url(r'^games/(?P<id>\d+)/$', views.GameAPIView.as_view())
]

視圖函數代碼

class GamesAPIView(View):
    """
    查詢所有的游戲
    """

    def get(self, request):
        games = GameInfo.objects.all()
        game_list = []
        for game in games:
            game_list.append({
                'id': game.id,
                'gtitle': game.gtitle,
                'game_date': game.game_date,
                'game_download': game.game_download,
                'gcommnet': game.gcommnet,
                'image': game.image.url if game.image else ''
            })
            # 要命令序列化就需要把safe設置成False
        return JsonResponse(game_list, safe=False)

    def post(self, request):
        """
        新增游戲
        :param request:
        :return:
        """

        body_data = request.body
        data_str = body_data.decode()
        game_dict = json.loads(data_str)

        game = GameInfo.objects.create(
            gtitle=game_dict['gtitle'],
            game_date= game_dict['game_date'],

        )

        return JsonResponse({
            'id': game.id,
            'gtitle': game.gtitle,
            'game_date': game.game_date,
            'game_download': game.game_download,
            'gcommnet': game.gcommnet,
            'image': game.image.url if game.image else ''
        }, status=201)


class GameAPIView(View):
    def get(self, request, id):
        """
        獲取單個游戲的信息
        :param request:
        :param pk:
        :return:
        """

        try:
            game = GameInfo.objects.get(id=id)
        except GameInfo.DoesNotExist:
            return HttpResponse(status=404)
        print(game)
        return JsonResponse({
            'id': game.id,
            'gtitle': game.gtitle,
            'game_date': game.game_date,
            'game_download': game.game_download,
            'gcommnet': game.gcommnet,
            'image': game.image.url if game.image else ''
        })

    def put(self, request, id):
        """
        修改游戲信息
        :param request:
        :param pk:
        :return:
        """
        try:
            game = GameInfo.objects.get(id=id)
        except GameInfo.DoesNotExist:
            return HttpResponse(status=404)

        body_data = request.body
        data_str = body_data.decode()
        game_dict = json.loads(data_str)

        game.gtitle = game_dict['gtitle']
        game.game_date = game_dict['game_date']
        game.save()
        return JsonResponse({
            'id': game.id,
            'gtitle': game.gtitle,
            'game_date': game.game_date,
            'game_download': game.game_download,
            'gcommnet': game.gcommnet,
            'image': game.image.url if game.image else ''
        })

    def delete(self, request, pk):
        """
        刪除游戲
        :param request:
        :param pk:
        :return:
        """
        try:
            game = GameInfo.objects.get(id=id)
        except GameInfo.DoesNotExist:
            return HttpResponse(status=404)

        game.delete()

        return HttpResponse(status=204)

查詢所有數據

增加數據(post提交後面要加/)

獲取單個數據

修改數據

刪除數據

REST介面的核心

1.將數據轉換成模型類的對象(將前端的數據,反序列化為模型類對象,保存到資料庫中)

2.將模型類的對象轉換為響應的數據

3.操作資料庫(將資料庫數據序列化為前端需要的格式)

序列化:

把將一種對象的狀態信息裝換成可以存儲或者可以傳輸形式的過程,比如將模型類轉換成JSON數據,整個過程將序列化(序列化和反序列化執行的過程相似的,也就是可以封裝代碼)

   

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、java中的scanner: scanner 是java中用來進行人機交互的函數; 使用前需要導入:java.util.Scanner包 import java.util.Scanner; 在使用時有以下語法: Scanner sc=new Scanner(System.in);//建立一個鍵盤 ...
  • 想了很久,我決定還是先從signal和slot(信號槽)開始講起。 signal和slot大家一定不陌生,先看一段示例(選自文檔): 使用signal和slot的類必須包含Q_OBJECT巨集,聲明slot需要使用public/private/protected slots:,signal則需要sig ...
  • 直接上代碼,先來個爬取豆瓣圖片的,大致思路就是發送請求-得到響應數據-儲存數據,原理的話可以先看看這個 https://www.cnblogs.com/sss4/p/7809821.html 再來個爬去標題類的 這個是下載小說的 (別人的代碼) ...
  • 字典: key值經過哈希函數的運算的結果決定value存放的地址,且key值是由不可變數組成。value可以是任何python的對象。 字典基本操作 增 查 刪 排 ...
  • 更新時間:2018 06 14 《Python指南》原文在 "這裡" 。本篇筆記主要是劃重點。 Python 3.6.3 1、簡單入門 1.1 編碼 預設情況下,Python 源文件是 UTF 8 編碼。 你也可以為源文件指定不同的字元編碼。 1.2 註釋 Python 中的註釋以 字元起始,直至實 ...
  • 生成器的特點是工作到一半,就會停下來看別人幹活直至有人踢它屁股,這時它才繼續往下幹活。實現這一功能的精髓要用到yield。 生成器是一種特殊的迭代器,因此我們先來瞭解一下什麼是迭代器。我們都知道著名的斐波那契數列:1、1、2、3、5、8、13、21、34……從第三個數開始,每個數都可以由其前面的兩個 ...
  • 今日內容: 1、子評論評論樓的實現;評論樹尚未實現; 2、富文本編輯器的使用。 XSS攻擊全稱跨站腳本攻擊,為了不和層疊樣式表(Cascading Style Sheets, CSS)的縮寫混淆,故將跨站腳本攻擊縮寫為XSS,XSS是一種在web應用中的電腦安全漏洞,它允許惡意web用戶將代碼植入 ...
  • 上一篇文章,學習了併發編程中的volatile,最後取了網上流傳很廣的一張圖來結尾,從圖中可以看出除了volatile變數的讀寫,還有一個叫做CAS的東西,所以這篇文章再來學習CAS。 1、 併發編程三要素-原子性、可見性、有序性 在討論CAS前,我想先討論一下併發編程的三要素,這個應該可以幫助理解 ...
一周排行
    -Advertisement-
    Play Games
  • Timer是什麼 Timer 是一種用於創建定期粒度行為的機制。 與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間後執行特定的操作,或者在特定的時間間隔內重覆執行操作。 它在分散式系統中具有重要作用,特別是在處理需要周期性執行的 ...
  • 前言 相信很多做WPF開發的小伙伴都遇到過表格類的需求,雖然現有的Grid控制項也能實現,但是使用起來的體驗感並不好,比如要實現一個Excel中的表格效果,估計你能想到的第一個方法就是套Border控制項,用這種方法你需要控制每個Border的邊框,並且在一堆Bordr中找到Grid.Row,Grid. ...
  • .NET C#程式啟動閃退,目錄導致的問題 這是第2次踩這個坑了,很小的編程細節,容易忽略,所以寫個博客,分享給大家。 1.第一次坑:是windows 系統把程式運行成服務,找不到配置文件,原因是以服務運行它的工作目錄是在C:\Windows\System32 2.本次坑:WPF桌面程式通過註冊表設 ...
  • 在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
  • 前言 .NET Feature Management 是一個用於管理應用程式功能的庫,它可以幫助開發人員在應用程式中輕鬆地添加、移除和管理功能。使用 Feature Management,開發人員可以根據不同用戶、環境或其他條件來動態地控制應用程式中的功能。這使得開發人員可以更靈活地管理應用程式的功 ...
  • 在 WPF 應用程式中,拖放操作是實現用戶交互的重要組成部分。通過拖放操作,用戶可以輕鬆地將數據從一個位置移動到另一個位置,或者將控制項從一個容器移動到另一個容器。然而,WPF 中預設的拖放操作可能並不是那麼好用。為瞭解決這個問題,我們可以自定義一個 Panel 來實現更簡單的拖拽操作。 自定義 Pa ...
  • 在實際使用中,由於涉及到不同編程語言之間互相調用,導致C++ 中的OpenCV與C#中的OpenCvSharp 圖像數據在不同編程語言之間難以有效傳遞。在本文中我們將結合OpenCvSharp源碼實現原理,探究兩種數據之間的通信方式。 ...
  • 一、前言 這是一篇搭建許可權管理系統的系列文章。 隨著網路的發展,信息安全對應任何企業來說都越發的重要,而本系列文章將和大家一起一步一步搭建一個全新的許可權管理系統。 說明:由於搭建一個全新的項目過於繁瑣,所有作者將挑選核心代碼和核心思路進行分享。 二、技術選擇 三、開始設計 1、自主搭建vue前端和. ...
  • Csharper中的表達式樹 這節課來瞭解一下表示式樹是什麼? 在C#中,表達式樹是一種數據結構,它可以表示一些代碼塊,如Lambda表達式或查詢表達式。表達式樹使你能夠查看和操作數據,就像你可以查看和操作代碼一樣。它們通常用於創建動態查詢和解析表達式。 一、認識表達式樹 為什麼要這樣說?它和委托有 ...
  • 在使用Django等框架來操作MySQL時,實際上底層還是通過Python來操作的,首先需要安裝一個驅動程式,在Python3中,驅動程式有多種選擇,比如有pymysql以及mysqlclient等。使用pip命令安裝mysqlclient失敗應如何解決? 安裝的python版本說明 機器同時安裝了 ...