拾伍 ● Ajax技術javascript
一 ● Ajax定義css
Ajax: 異步的 JavaScript 和 XML (Asynchronous+Javascript+XML) html 經過Ajax, 咱們能夠在不從新加載整個網頁的狀況下,對網頁的某部分進行更新(從新加載整個網頁是: 雕版印刷, 對網頁的某個部分進行更新: 活字印刷)前端 |
※ 異步: 向服務器發送請求的時候,咱們沒必要等待結果,而是能夠同時作其餘的事情,等到有告終果咱們能夠再來處理這個事java |
二 ● 常見Ajax技術python
1 ● $.post()、$.get()、$.load()是一些簡單Ajax方法(用得較少)mysql
<html> jquery <head> nginx <script type="text/javascript" src="/jquery/jquery.js"></script> ajax <script type="text/javascript"> $(document).ready(function () { $("#b01").click(function () { $('#myDiv').load('/jquery/test1.txt'); }); }); </script> </head> <body>
<div id="myDiv"><h2>經過 AJAX 改變文本</h2></div> <button id="b01" type="button">改變內容</button>
</body> </html> |
2 ● jQuery.ajax(), 即$.ajax(), 能處理複雜的邏輯
一般使用格式 $("#login_btn").on("click", function () { $.ajax({ url: "/foo/", type: 'POST', data: 鍵值對(data是引用數據類型), success: function(data){}, dataType: dataType }); }); |
$.ajax()的參數是一個字典, 它的鍵包括: url→必需,(默認爲當前頁地址)指向要操做的路徑 type→可選, 請求方式("POST", "GET") data→可選, 鍵值對(data是引用數據類型), 連同請求發送到服務器。 success→可選, 請求成功時執行的回調函數。 dataType→可選, 規定預期的服務器響應的數據類型。若未指定, 則智能判斷(xml、json、script 或 html)。 |
※ 若是要處理 $.ajax() 獲得的數據,則須要使用回調函數:beforeSend、error、dataFilter、success、complete。 |
※ jQuery.ajax()的參數列表
參數名 |
類型 |
描述 |
url |
String |
(默認: 當前頁地址) 發送請求的地址。 |
type |
String |
(默認: "GET") 請求方式 ("POST" 或 "GET"),默認爲 "GET"。注意:其它HTTP 請求方法,如 PUT 和 DELETE 也可使用,但僅部分瀏覽器支持。 |
timeout |
Number |
設置請求超時時間(毫秒)。此設置將覆蓋全局設置。 |
async |
Boolean |
(默認: true) 默認設置下,全部請求均爲異步請求。若是須要發送同步請求,請將此選項設置爲 false。注意,同步請求將鎖住瀏覽器,用戶其它操做必須等待請求完成才能夠執行。 |
beforeSend |
Function |
發送請求前可修改 XMLHttpRequest 對象的函數,如添加自定義 HTTP頭。XMLHttpRequest 對象是惟一的參數。 function (XMLHttpRequest) { this; // the options for this ajax request } |
cache |
Boolean |
(默認: true) jQuery 1.2 新功能,設置爲 false 將不會從瀏覽器緩存中加載請求信息。 |
complete |
Function |
請求完成後回調函數 (請求成功或失敗時均調用)。參數:XMLHttpRequest 對象,成功信息字符串。 function (XMLHttpRequest, textStatus) { this; // the options for this ajax request } |
contentType |
String |
(默認: "application/x-www-form-urlencoded") 發送信息至服務器時內容編碼類型。默認值適合大多數應用場合。 ※ from的enctype屬性的默認值也是application/x-www-form-urlencoded |
data |
Object, String |
發送到服務器的數據。將自動轉換爲請求字符串格式。GET 請求中將附加在 URL 後。查看 processData 選項說明以禁止此自動轉換。必須爲Key/Value 格式。若是爲數組,jQuery 將自動爲不一樣值對應同一個名稱。如 {foo:["bar1", "bar2"]} 轉換爲 '&foo=bar1&foo=bar2'。 |
dataType |
String |
預期服務器返回的數據類型。若是不指定,jQuery 將自動根據 HTTP 包MIME 信息返回 responseXML 或 responseText,並做爲回調函數參數傳遞,可用值: "xml": 返回 XML 文檔,可用 jQuery 處理。 "html": 返回純文本 HTML 信息;包含 script 元素。 "script": 返回純文本 JavaScript 代碼。不會自動緩存結果。 "json": 返回 JSON 數據。 "jsonp": JSONP 格式。使用 JSONP 形式調用函數時,如 "myurl?callback=?" jQuery 將自動替換 ? 爲正確的函數名,以執行回調函數。 |
error |
Function |
(默認: 自動判斷 (xml 或 html)) 請求失敗時將調用此方法。這個方法有三個參數:XMLHttpRequest 對象,錯誤信息,(可能)捕獲的錯誤對象。 function (XMLHttpRequest, textStatus, errorThrown) { // 一般狀況下textStatus和errorThown只有其中一個有值 this; // the options for this ajax request } |
global |
Boolean |
(默認: true) 是否觸發全局 AJAX 事件。設置爲 false 將不會觸發全局 AJAX事件,如 ajaxStart 或 ajaxStop 。可用於控制不一樣的Ajax事件 |
ifModified |
Boolean |
(默認: false) 僅在服務器數據改變時獲取新數據。使用 HTTP 包 Last-Modified 頭信息判斷。 |
processData |
Boolean |
(默認: true) 默認狀況下,發送的數據將被轉換爲對象(技術上講並不是字符串) 以配合默認內容類型 "application/x-www-form-urlencoded"。若是要發送 DOM 樹信息或其它不但願轉換的信息,請設置爲 false。 |
success |
Function |
請求成功後回調函數。這個方法有兩個參數:服務器返回數據,返回狀態 function (data, textStatus) { // data could be xmlDoc, jsonObj, html, text, etc... this; // the options for this ajax request } |
3 ● jQuery的serialize() 方法
語法: $(selector).serialize() serialize() 方法經過序列化表單值建立 URL 編碼的文本字符串。 您能夠選擇一個或多個表單元素(如輸入和/或文本區),或表單元素自己。 序列化的值可在生成 AJAX 請求時, 用於 URL 查詢字符串中。 |
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>菜鳥教程(runoob.com)</title> <script src="http://cdn.static.runoob.com/libs/jquery/1.10.2/jquery.min.js"> </script> <script> $(document).ready(function () { $("button").click(function () { $("div").text($("form").serialize()); }); }); </script> </head> <body>
<form action=""> 第一個名稱: <input type="text" name="FirstName" value="Mickey"/><br> 最後一個名稱: <input type="text" name="LastName" value="Mouse"/><br> </form> <button>序列化表單值</button> <div></div>
</body> </html>
效果: |
序列化
● Django支持的序列化格式
Django支持的序列化格式包括json, xml和yaml, 咱們只關注json的django序列化格式 |
JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式,主要用於傳送數據。 |
● Django的serializers.serialize() & python的json.dumps()
對於Django的Queryset<Queryset [object,object,object]>, 不能使用python的json方法序列化,而要用到django的 serializers |
狀況1: 使用serializers.serialize from django.core import serializers
ret = models.BookType.objects.all() data = serializers.serialize("json", ret)
#serialize()的參數是: # 序列化目標格式, # 序列化的QuerySet對象 (事實上,第二個參數能夠是任何可迭代的Django Model實例,但它不少狀況下就是一個QuerySet). |
狀況2: 使用json.dumps() import json
# ret1 = models.BookType.objects.all().values('caption') # ret1['列名'] = list(ret1)
ret = models.BookType.objects.all().values_list('caption') ret = list(ret) result = json.dumps(ret)
# 提示:. # values()取到的格式是這種: < querytset[{key: value}, {key: value}.......] > 列表裏面的字典類型的格式 # values_list()取到的格式是這種: < querytset[(), (), (), ()......] > 列表裏面元祖的格式 |
拾陸 ● Django的表單系統: 主要分兩種
一● 基於django.forms.Form
定義形式 from django import forms class FormName(forms.Form): field1 = forms.XXField(...) # model字段是field1 = models.XXField(...) field2 = forms.XXField(...)
表單字段的參數包括(不必定都有, 用逗號分隔參數) ① max_length這種字段固有的參數 ② 部件(widget)對象 ※ 字段參數負責"校驗邏輯",而部件對象負責" 顯示邏輯" #form.py from django import forms
class CommentForm(forms.Form): name = forms.CharField() url = forms.URLField() comment = forms.CharField(widget=forms.Textarea()) # Textarea後的括號能夠省略 # Widget (部件)是Django 對HTML 輸入元素的表示。(A widget is Django's representation of an HTML input element.) # 這裏的 comment 會變成 Textarea,而不是 CharField
# 若是想讓Widget 具備一些特殊的CSS 類, 能夠這樣設置: class CommentForm(forms.Form): name = forms.CharField(widget=forms.TextInput(attrs={'class': 'special'})) url = forms.URLField() comment = forms.CharField(widget=forms.TextInput(attrs={'size': '40'})) |
title = forms.CharField(max_length=20, min_length=5, error_messages={'required': '標題不能爲空', 'min_length': '標題最少爲5個字符', 'max_length': '標題最多爲20個字符'}, widget=widgets.TextInput(attrs={'class': "form-control", 'placeholder': '標題5-20個字符'})) |
●細節知識
Form 的對象具備一個is_valid() 方法,它爲全部的字段運行驗證的程序。 當調用這個方法時,若是全部的字段都包含合法的數據,它將: ① 返回True ② 將表單的數據放到cleaned_data屬性中。 |
其它Form對象的API: http://www.lxway.com/496695522.htm |
二● 基於django.forms.ModelForm
※ ModelForm 能容許咱們經過一個 Model, 直接建立一個和該Model的字段一一對應的表單,大大方便了表單操做: #models.py class ExamInfo(models.Model): field1 = models.XXField(...) # 表單字段是field1 = forms.XXField(...) field2 = models.XXField(...)
#form.py #定義ExamInfo的Form,Form的名字爲模型名+Form from django.forms import ModelForm from .models import ExamInfo class ExamInfoForm(ModelForm): class Meta: model = ExamInfo fields = '__all__' # fields = ('field1','field2') #只顯示model中指定的字段 |
● ※ form組件的主要功能
① 生成HTML標籤 ② 驗證用戶數據(顯示錯誤信息)----對用戶提交的內容進行驗證(from表單/Ajax) ③ 提交、保留上次提交的數據 ④ 初始化頁面顯示內容 |
● ※ 鉤子(hook)(對於django來講)
局部鉤子:校驗單個字段,例如:用戶名最短5個字符,最長12個字符;密碼必須大於8位,驗證碼必須正確 全局鉤子:校驗多個字段,例如:密碼和重複密碼必須一致
※ 對於MFC編程來講,消息鉤子分爲局部鉤子和全局鉤子。 局部鉤子將僅攔截某一進程的指定消息, 全局鉤子將攔截系統中全部進程的指定消息。 |
拾柒 ● 跨站請求僞造(csrf/xsrf, Cross-site request forgery)
一 ● csrf定義
Django具備防止跨站請求僞造的功能,有全局和局部之分 --全局防止跨站請求僞造經過中間件 django.middleware.csrf.CsrfViewMiddleware 來完成 --局部防止跨站請求僞造經過@csrf_protect和@csrf_exempt裝飾器來實現 ※ from django.views.decorators.csrf import csrf_protect, csrf_exempt ※ @csrf_protect,爲當前函數強制設置防跨站請求僞造功能,即使settings中沒有設置全局中間件。 ※ @csrf_exempt,取消當前函數防跨站請求僞造功能,即使settings中設置了全局中間件。 |
二 ● csrf案例
用戶訪問www.mybank.com網站, 登陸而且未退出, 用戶同時訪問了一個黑客網站, 黑客網站發給客戶的html代碼中帶有上面的代碼(一段僞裝生成一個圖片元素的html代碼, 是get方式的數據傳遞), 於是訪問了src對應的可實現轉帳的代碼(此時cookie未失效), 所以, 一段服務端發給瀏覽器的csrf_token可用來驗證某段代碼是用戶的瀏覽器發送的代碼, 而不是其它服務器發送的. |
三 ● csrf的應用
※ 詳見: http://www.javashuo.com/article/p-xcptltgl-cn.html
1 ● 普通表單
# ① veiw中設置返回值: return render_to_response('Account/Login.html',data,context_instance=RequestContext(request)) # 或者 return render(request, 'xxx.html', data)
# ② html中設置Token: 在form表單裏面須要添加{%csrf_token%} |
這樣當你查看頁面源碼的時候,能夠看到form中有一個input是隱藏的 總結原理:當用戶訪問login頁面的時候,會生成一個csrf的隨機字符串,而且cookie中也存放了這個隨機字符串(以下圖),當用戶再次提交數據的時候會帶着這個隨機字符串提交,若是沒有這個隨機字符串則沒法提交成功 |
|
2 ● Ajax
對於傳統的form,能夠經過表單的方式將token再次(體會這個再次)發送到服務端,而對於ajax的話,使用以下方式。 |
1, csrf在ajax提交的時候是經過請求頭(headers)傳遞的給後臺的 2, csrf在前端的key爲:X-CSRFtoken,到後端的時候django會自動添加HTTP_,而且最後爲HTTP_X_CSRFtoken 3, csrf在form中提交的時須要在前端form中添加{%csrftoken%} |
$("#btn1").click(function () { $.ajax({ url:"/login/", type:"POST", data:{"usr":"root","pwd":"123"}, headers:{ "X-CSRFtoken":$.cookie("csrftoken")}, success:function (arg) {
} }); }); |
<script> //狀況一: 通常狀況 $('#i1').click(function () { var csrf_token = $.cookie('csrf_token') $.ajax({ url: 'xxx', type: 'post', data: {'username': xxx, 'password': 123123}, headers: {'x-CSRFtoken': csrf_token}, success: function (arg) {
} }); });
//狀況二: 若是想要實如今當get方式的時候不須要提交csrftoken,當post的時候須要,實現這種效果的代碼以下: // Ajax整個頁面統一配置 // xhr 是 XMLHttpRequest對象,默認Ajax底層使用的就是它 var csrftoken = $.cookie('csrftoken');
function csrfSafeMethod(method) { // these HTTP methods do not require CSRF protection return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); }
$.ajaxSetup({ beforeSend: function (xhr, settings) { if (!csrfSafeMethod(settings.type) && !this.crossDomain) { xhr.setRequestHeader("X-CSRFToken", csrftoken); } } }); </script> |
拾捌 ● WSGI
一 ● WSGI定義
※ CGI(Common Gateway Interface)是通用網關接口,而WSGI就是Python的CGI包裝,相對於Fastcgi是PHP的CGI包裝, 它規定了Web服務器調用其餘可執行程序(CGI程序)的接口協議標準。 |
(1) WSGI(Web Server Gateway Interface, Web服務器網關接口)是一種規範, 是將Python服務器端程序鏈接到Web服務器的通用協議,它實現了Web服務器和Web應用程序之間的解耦(decoupling)。
(2) WSGI接口規範的目的就是規範Web服務器與Web應用之間的交互,在協議之間進行轉換(WSGI就是Web就是一個網關(Gateway),而網關的做用就是在協議之間進行轉換。)
(3) WSGI將Web組件分紅三類:Web服務器(WSGI Server)、Web中間件(WSGI Middleware)與Web應用程序(WSGI Application)。 --服務器:指的是實現了調用應用(call application)的部分。 --中間件:處於服務器和應用兩側,起粘合做用,具體包括:請求處理、environ, 即環境變量的處理。 --應用:指的是能夠被調用的一個對象,通常指的是包含一個__call__方法(實例能夠看成函數通常調用)的對象。
python標準庫提供的獨立WSGI服務器(WSGI server)稱爲wsgiref(模塊)。 |
二 ● 注意
※ environ是Python內置的dict對象,它是系統的環境變量; ※ 經過import os; os.environ獲取全部的環境變量; ※ 查看環境變量: os.environ.get('path')能夠獲取path這個環境變量被賦值的路徑 ※ 設置環境變量: os.environ["PATH"] = os.environ["PATH"]+';' + "要增長的路徑" |
三 ● WSGI的角色
|
WSGI的接口分爲兩個: 一個是它與Web服務器的接口,另外一個是它與服務器端程序的接口。 ① WSGI Server與Web服務器的接口包括uwsgi、fast cgi等 (咱們無須詳細學習) ② 服務器端的開發者須要關注的是WSGI與服務器端程序的接口。 |
※ Django、CherryPy 都自帶符合WSGI規範的 WSGI server, ※ 而有些 WSGI 下的框架好比 pylons、bfg 等, 本身不實現 WSGI server, 而是使用 paste 做爲 WSGI server, paste 是流行的 WSGI server, 帶有不少中間件。 |
四 ● Django內置的服務器
Django 內部自帶了一個方便本地測試的小服務器, 因此在剛開始學習 Django 的時候並不需搭建 apache 或者 nginx 服務器.
Django 自帶的服務器基於 python wsgiref 模塊實現的, 其百分之七八十的代碼都是 wsgiref 中的代碼, 只重寫了一部分. 具體來講, Django 內置服務器基於 django.core.servers 和 django.core.handlers這兩個類共同實現. |
拾玖 ● 中間件(MIDDLEWARE )
一 ● 中間件的介紹
在django中,中間件其實就是一個類; 在settings.py中,MIDDLEWARE 列表的每個元素就是一箇中間件:
在http請求到達視圖函數以前和視圖函數return以後,Django會根據本身的規則在合適的時機執行中間件中相應的方法。
注意: 若是在其中一箇中間件裏 request方法裏 return了值,就會執行當前中間件的response方法,返回給用戶而後報錯, 而且不會再執行下一個中間件。
Django會先按順序執行各個中間件的request方法, 而後執行視圖函數, 而後反序執行各個中間件的response方法.例如: |
二 ● 自定義中間件的步驟
|
|
結果: 爲啥報錯了呢?
由於自定義的中間件response方法沒有return結果交給下一個中間件,致使http請求中斷了!!!
注意: 自定義的中間件request 方法不要return結果, 不然, 中間件再也不會往下執行,致使 http請求到達不了視圖層.
|
三 ● 中間件中能夠定義5個方法,分別是:
process_request(self,request) process_view(self, request, callback, callback_args, callback_kwargs) process_template_response(self,request,response) process_exception(self, request, exception) process_response(self, request, response |
有關自定義中間件, 參見: https://www.cnblogs.com/huchong/p/7819296.html |
貳拾 ● Django的信號
一 ● 信號的定義
Django中提供了"信號調度",用於在框架執行操做時解耦. 一些動做發生的時候,系統會根據信號定義的函數執行相應的操做. (例以下面的: 建立數據庫記錄時, 觸發pre_save和post_save信號) 對於Django內置的信號,僅需註冊指定信號,當程序執行相應操做時,系統會自動觸發註冊函數 |
二 ● 信號的案例
※ 建立數據庫記錄時, 觸發pre_save和post_save信號 |
# models.py from django.db import models class UserInfo(models.Model): name=models.CharField(max_length=32) pwd=models.CharField(max_length=64) |
# views.py from django.shortcuts import render,HttpResponsefrom app01 import models def index(request): models.UserInfo.objects.create(name="mysql",pwd="mysql123") return HttpResponse("ok") |
# 項目的__init__.py文件中代碼 from django.db.models.signals import pre_save,post_save
def pre_save_func(sender,**kwargs): print("pre_save_func") print("pre_save_msg:",sender,kwargs)
def post_save_func(sender,**kwargs): print("post_save_func") print("post_save_msg:",sender,kwargs)
pre_save.connect(pre_save_func) # models對象保存前觸發callback函數 post_save.connect(post_save_func) # models對象保存後觸發函數 |
# 建立一個index.html網頁(內容不限),用瀏覽器打開這個項目,在服務端後臺打印信息以下: pre_save_func pre_save_msg: <class 'app01.models.UserInfo'> {'signal': <django.db.models.signals.ModelSignal object at 0x0000000002E62588>, 'instance': <UserInfo: UserInfo object>, 'raw': False, 'using': 'default', 'update_fields': None}
post_save_func post_save_msg: <class 'app01.models.UserInfo'> {'signal': <django.db.models.signals.ModelSignal object at 0x0000000002E62630>, 'instance': <UserInfo: UserInfo object>, 'created': True, 'update_fields': None, 'raw': False, 'using': 'default'}
# 比較打印的結果,能夠看到models對象保存後,在打印信息裏包含一個"create=True"的鍵值對. |
有關自定義信號 , 詳見: http://www.cnblogs.com/haiyan123/p/8259647.html |
貳拾壹 ● Django的緩存
一 ● 緩存的定義
緩存,緩存將一個某個views的返回值保存至內存或者memcache中,以後再有人來訪問時,則再也不去執行view中的操做,而是直接從內存或者Redis中以前緩存的內容拿到,並返回。 |
Django settings 中 cache 默認爲 { 'default': { 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', } } 也就是默認利用本地的內存來當緩存,速度很快,固然可能出來內存不夠用的狀況。 |
二 ● Django中提供緩存方式
※ 下面的緩存方式都須要在setting.py裏面配置: - 開發調試 - 本地內存(默認的緩存方式) - 文件 - 數據庫 - Memcache緩存(python-memcached模塊)----memcache是一套分佈式的高速緩存系統 - Memcache緩存(pylibmc模塊) - Redis緩存 |
詳見: https://code.ziqiangxuetang.com/django/django-cache.html http://www.cnblogs.com/haiyan123/p/8424231.html |
貳拾貳 ● admin
django amdin是django提供的一個後臺管理頁面,改管理頁面提供完善的html和css,使得你在經過Model建立完數據庫表以後,就能夠對數據進行增刪改查. |
咱們學習和使用更加完善的xadmin, 下面只介紹admin的簡單用法. |
● admin的通常使用步驟
① 在項目名/項目名/urls.py配置url url(r'^admin/', include(admin.site.urls))
② 註冊medel類到admin: 在應用名/admin.py裏面把咱們當前應用models.py裏面的User 這個model註冊進去,以下。 from django.contrib import admin from .models import User
admin.site.register(User) # 經過admin.site.register()函數逐個聲明要管理的模型類. # 再如: 假設有Book, MyAdmin, Publish, Author五個模型類: admin.site.register(Book,MyAdmin) # 將Author模塊和管理類綁定在一塊兒,註冊到後臺管理 admin.site.register(Publish) admin.site.register(Author)
經過python manage.py runserver命令啓動項目,而後http://127.0.0.1:8000/admin訪問,會自動跳轉到它的主頁,如圖所示:
③ 經過"python manage.py createsuperuser"命令建立超級用戶,例如: python manage.py createsuperuser Username: admin Email address: Password: Password (again): Superuser created successfully.
假如我建立了一個用戶名:admin 密碼:admin123的用戶,咱們就能夠登陸進django admin後臺管理系統了,登陸成功以下所示,咱們能夠經過右側的 "add" 添加用戶: 咱們操做admin和咱們操做數據庫是同樣的,例如上面的Users對應的就是sqlite數據庫中的user表,也就是說,若是要求不高的話後臺都不須要咱們開發了! |
貳拾叄 ● 設置404頁面和500頁面
|
1, 在blog/templates/user下面添加一個404.html和一個500.html頁面,代碼任意,
2, 配置setting.py文件,以下: ※ 當DEBUG=True的時候, django的runserver是自動使用StaticFilesHandler來serve 靜態文件的, 當DEBUG=False的時候, django就不處理靜態文件, 交由其它的靜態服務器來處理.
3, 在主urls.py(settings.py文件下面)添加以下配置: 前面的代碼是固定的,後面代碼的意思是在blog模塊下的views.py中處理這兩個404和500錯誤。
4, 在views.py中添加page_not_found和page_error這兩個方法,用於頁面跳轉,以下: # 404錯誤 def page_not_found(request): return render(request,'user/404.html',{}) # 500錯誤 def page_error(request): return render(request, 'user/500.html', {}) |
貳拾肆 ● 富文本編輯器
經常使用富文本編輯器 |
Kindeditor 參考: http://www.cnblogs.com/wupeiqi/articles/6307554.html
DjangoUeditor3 參考: http://www.cnblogs.com/adc8868/p/7580705.html
Tinymce 參考: http://blog.csdn.net/u010505059/article/details/78650742 |
貳拾伍 ● REST & RESTful API
REST, Representational State Transfer,"表現層狀態轉化", 全稱是 Resource Representational State Transfer, 即"資源在網絡中以某種表現形式進行狀態轉移" ※ Resource:資源,即數據(網絡的核心,例如newsfeed,friends等); Representational:某種表現形式,例如JSON,XML,JPEG等; State Transfer:狀態變化, 經過GET,POST等HTTP動詞實現。 |
RESTful API: 符合REST架構設計的API, HTTP協議就是屬於REST架構的設計模式, 例如: 無狀態,請求-響應機制. RESTful API要求增刪查改都是一個地址,具體靠HTTP請求頭部信息判斷, HTTP請求頭包括Content-Type等信息. |
※ REST是全部Web應用都應該遵照的架構設計指導原則。固然,REST並非法律,違反了REST的指導原則,仍然可以實現應用的功能。可是違反了REST的指導原則,會付出不少代價,特別是對於大流量的網站而言 |