python中的请求方法_http协议的9种请求方法
http協議的9種請求方法
在http/1.1協議中,定義了8種訪問指定資源的方法,他們分別為
OPTIONS
GET
HEAD
POST
PUT
PATCH
DELETE
TRACE
CONNECT
為了更好的講解和演示這9種http請求的方法,我用flask寫了一個簡單的服務程序
import json
from flask import Flask, request, make_response, jsonify
app = Flask(__name__)
@app.route("/book", methods=['HEAD', 'GET', 'POST', 'PUT', 'DELETE', 'TRACE'])
def book():
method = request.method
if method == 'HEAD':
return book_head()
elif method == 'GET':
return book_get()
elif method == 'POST':
#return book_post_form()
return book_post_json()
elif method == 'PUT':
return book_put()
elif method == 'DELETE':
return book_delete()
def book_head():
return jsonify({'name': 'python進階教程', 'price': 35.5})
def book_get():
return jsonify({'name': 'python進階教程', 'price': 35.5})
def book_post_form():
name = request.form['name']
price = float(request.form['price'])
print(name, price)
return jsonify({'status': 1, 'msg': '新增成功'})
def book_post_json():
data = json.loads(request.get_data())
print(data)
return jsonify({'status': 1, 'msg': '新增成功'})
def book_put():
data = json.loads(request.get_data())
print(data)
return jsonify({'status': 1, 'msg': '修改成功'})
def book_delete():
data = json.loads(request.get_data())
print(data)
return jsonify({'status': 1, 'msg': '刪除成功'})
if __name__ == '__main__':
app.run(debug=True)
這個服務只提供了一個URI資源,下面逐個介紹這8種請求資源的方法
1. OPTIONS
向服務器發送options方法,可以測試服務器功能是否正常,服務器會返回這個資源所支持的HTTP請求方法,在javascript中,使用XMLHttpRequest對象進行CORS跨域資源共享時,會先使用options方法進行嗅探,以此判斷對指定資源是否具有訪問權限。
flask框架會自動處理OPTIONS和HEAD請求,我在指定'/book'所支持的methods中并沒有寫OPTIONS,但使用requests發送OPTIONS請求,可以得到正常響應
import requests
url = 'http://127.0.0.1:5000/book'
def test_options():
res = requests.options(url)
print(res.headers)
test_options()
response 的headers里,會返回Allow 首部,其內容為"TRACE, GET, HEAD, PATCH, POST, DELETE, OPTIONS, PUT",這表示,請求'/book'時,服務器支持這么多的請求方法。
2. GET
GET方法用于顯示的請求指定資源,通常,GET方法只用于讀取數據,這在restful接口中尤為嚴格,GET方法絕不應該應用于會產生副作用的非冪等操作中。
所謂冪等,是一個數學與計算機概念,在編程中一個冪等操作的特點是其任意多次執行所產生的影響均與一次執行的影響相同。
本示例中,服務端收到GET請求后,返回一段json數據,發送請求的客戶端程序如下
import requests
url = 'http://127.0.0.1:5000/book'
def test_get():
params = {'name': 'python'}
res = requests.get(url, params=params)
print(res.text)
test_get()
你應該已經注意到,發送get請求也是可以攜帶參數的,而不只是post可以.
不同之處在于,post請求的參數放在dody體中,而get請求的參數放在url中,服務端收到的請求的完整url是
http://127.0.0.1:5000/book?name=python
GET請求的URL在瀏覽器里是極容易暴露的,因此用戶的敏感信息不可以明文傳輸。
3. HEAD
HEAD方法在各個方面均與GET方法相同,唯一不同之處在于,服務器收到HEAD請求,不會將body里的內容返回給客戶端,在本實例中,雖然響應HEAD請求時,明確的使用return語句返回了數據
return jsonify({'name': 'python進階教程', 'price': 35.5})
但客戶端不會收到這些數據,既然收不到數據,HEAD方法還有什么用處呢?
HEAD方法通常用來獲取資源的信息,這些信息都蘊藏在響應頭信息中,比如Content-Length, 客戶端只是想知道自己將要請求的資源有多大,而并不是真的想要獲取這份資源,那么就可以使用HEAD方法進行查看,雖然返回的response里沒有body數據,但header里的部首和使用GET請求時返回的完全一樣。
一個比較實用的場景如下,有一個很大的文件需要下載,單線程下載會很慢,那么就可以考慮使用多線程,每個線程只下載資源的一段,這個利用Range部首很容易就做到,那么整件時間最關鍵的就是獲得資源的大小,你可以使用GET請求,但更便捷的方法是用HEAD請求,畢竟GET請求會返回整個文件。多線程下載大文件,可以參考我的一篇文章https://blog.csdn.net/KWSY2008/article/details/49204047
4. POST
post用于向指定資源提交數據,在restful風格的接口里,post用于新增數據。
post請求提交的數據放在請求的body體中,post提交的數據一般有兩種格式,一種是form表單,一種是json數據
4.1 form表單
我們在登錄某個網站的后臺時,在網頁上填寫用戶名和密碼,點擊回車后的提交過程就是post請求,請求的Content-Type值為 application/x-www-form-urlencoded 下面是模擬客戶端提交form表單的一段代碼
import requests
url = 'http://127.0.0.1:5000/book'
def test_form_post():
data = {'name': 'python', 'price': 45.6}
res = requests.post(url, data=data)
print(res.text)
test_form_post()
服務端處理這種post請求要使用book_post_form函數,收到的請求body體中,數據為
name=python&price=45.6
flask框架會幫助我們解析這里的內容,我們通過request.form對象即可獲得name和price
上面的代碼是通過requests庫直接提交,如果是通過網頁上的form表單進行提交,則form表單應該是如下形式
name:
price:
application/x-www-form-urlencoded 是表單默認的提交方式,你也可以通過enctype 來指定提交方式
如果你的表單還要上傳文件,那么enctype則要設置成multipart/form-data
提交json數據
另一種較為常用的post數據格式是json,下面是一個具體示例
import requests
url = 'http://127.0.0.1:5000/book'
def test_json_post():
data = {'name': 'python', 'price': 45.6}
res = requests.post(url, json=data)
print(res.text)
test_json_post()
服務端收到的請求的Content-Type 為application/json,body體中的數據為
{"name": "python", "price": 45.6}
不同于form表單數據,json數據需要我們自己寫代碼從body中取出并loads成字典來使用,具體方法參見flask 服務端程序里的book_post_json函數
5. PUT
put請求方法用于向指定資源上傳最新數據,用于更新操作,該方法是冪等操作。同post一樣,提交數據時,可以使用form表單或者json格式數據,下面是具體示例
import requests
url = 'http://127.0.0.1:5000/book'
def test_put():
data = {'name': 'python', 'price': 55.6}
res = requests.put(url, json=data)
print(res.text)
test_put()
6. PATCH
PATCH方法是HTTP/1.1標準制定之后擴展的方法,和PUT一樣,也用于資源的更新,不同之處有兩點
PATCH用于資源的部分更新,PUT多用于資源的整體更新
如果資源不存在,使用PATCH時應創建一個新的資源,而PUT則不要求創建新資源
下面是使用patch請求的示例代碼
import requests
url = 'http://127.0.0.1:5000/book'
def test_patch():
data = {'name': 'python'}
res = requests.request('trace', url, json=data)
print(res.text)
test_patch()
7. DELETE
delete方法用于刪除URI所標識的資源,同樣是冪等操作
import requests
url = 'http://127.0.0.1:5000/book'
def test_delete():
data = {'name': 'python', 'price': 55.6}
res = requests.delete(url, json=data)
print(res.text)
test_delete()
8.TRACE
trace請求方法用于http請求的測試和診斷,根據協議,服務器在收到trace請求后,應回顯所收到的數據,即服務器返回自己所收到的數據。
下面是客戶端發送trace請求的一個例子
import requests
url = 'http://127.0.0.1:5000/book'
def test_trace():
data = {'name': 'python'}
res = requests.request('trace', url, json=data)
print(res.text)
test_trace()
requests模塊目前還沒有提供專門用來發送trace請求的方法,因此我這里使用request方法直接進行發送
9. CONNECT
connect請求方法在我們日常的開發工作中是不會遇到的,因為它的作用是讓服務器作為代理,讓服務器代替用戶訪問其他網頁,其實就是代理服務器。
鑒于connect在日常工作中很難有所應用,因此該請求不提供參考示例,感興趣的同學可以閱讀以下幾篇博文
10. 最后啰嗦幾句
雖然http協議提供了這么多種方法,但使用的最為頻繁的卻只有get和post的,甚至是濫用。
restful風格的接口提倡使用http方法來標識區分一個請求操作意圖,比如獲取數據用get,新增用post,修改用put,刪除用delete。
然而在實際工作中,我看到的最多的代碼都沒有遵守這些規則,而是大量的使用post請求,區分請求意圖的方法是使用不同的uri,比如獲取數據用get_xx,新增數據用add_xx, 修改數據用modify_xx,刪除數據用del_xx, 一個post請求,實現了對同一個資源的四種操作,個人很不喜歡這種風格的接口。
總結
以上是生活随笔為你收集整理的python中的请求方法_http协议的9种请求方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小米贷款有3天宽限期吗
- 下一篇: SCARA四轴机器人丝杆花键_花键丝杆一