本文目錄一覽:
- 1、Python實現介面請求及封裝
- 2、python 如何對接api
- 3、如何使用python 開發一個api
- 4、如何通過python調用新浪微博的API
- 5、python介面自動化腳本請求添加token信息2018-06-22
Python實現介面請求及封裝
基於http協議,最常用的是GET和POST兩種方法。
介面文檔需要包含哪些信息:
以典型的(一兩個)參數做為判斷是否請求通過(重點是看響應的信息判斷)
post請求有兩種常用的請求格式:
1、key-value的格式’Content-Type’:’
application/x-www-form-urlencoded’
2、標準json的格式:’Content-Type’:’application/json’
#key-value
#json
python 如何對接api
python對接api,可以調用lib或dll或其直接的語言文件的源代碼
基本都是直接import進來就行了
如何使用python 開發一個api
使用 Python 和 Flask 設計 RESTful API
近些年來 REST (REpresentational State Transfer) 已經變成了 web services 和 web APIs 的標配。
在本文中我將向你展示如何簡單地使用 Python 和 Flask 框架來創建一個 RESTful 的 web service。
什麼是 REST?
六條設計規範定義了一個 REST 系統的特點:
客戶端-伺服器: 客戶端和伺服器之間隔離,伺服器提供服務,客戶端進行消費。
無狀態: 從客戶端到伺服器的每個請求都必須包含理解請求所必需的信息。換句話說, 伺服器不會存儲客戶端上一次請求的信息用來給下一次使用。
可緩存: 伺服器必須明示客戶端請求能否緩存。
分層系統: 客戶端和伺服器之間的通信應該以一種標準的方式,就是中間層代替伺服器做出響應的時候,客戶端不需要做任何變動。
統一的介面: 伺服器和客戶端的通信方法必須是統一的。
按需編碼: 伺服器可以提供可執行代碼或腳本,為客戶端在它們的環境中執行。這個約束是唯一一個是可選的。
什麼是一個 RESTful 的 web service?
REST 架構的最初目的是適應萬維網的 HTTP 協議。
RESTful web services 概念的核心就是「資源」。 資源可以用 URI 來表示。客戶端使用 HTTP 協議定義的方法來發送請求到這些 URIs,當然可能會導致這些被訪問的」資源「狀態的改變。
HTTP 標準的方法有如下:
========== ===================== ==================================
HTTP 方法 行為 示例
========== ===================== ==================================
GET 獲取資源的信息
GET 獲取某個特定資源的信息
POST 創建新資源
PUT 更新資源
DELETE 刪除資源
========== ====================== ==================================
REST 設計不需要特定的數據格式。在請求中數據可以以 JSON 形式, 或者有時候作為 url 中查詢參數項。
設計一個簡單的 web service
堅持 REST 的準則設計一個 web service 或者 API 的任務就變成一個標識資源被展示出來以及它們是怎樣受不同的請求方法影響的練習。
比如說,我們要編寫一個待辦事項應用程序而且我們想要為它設計一個 web service。要做的第一件事情就是決定用什麼樣的根 URL 來訪問該服務。例如,我們可以通過這個來訪問:
http://[hostname]/todo/api/v1.0/
在這裡我已經決定在 URL 中包含應用的名稱以及 API 的版本號。在 URL 中包含應用名稱有助於提供一個命名空間以便區分同一系統上的其它服務。在 URL 中包含版本號能夠幫助以後的更新,如果新版本中存在新的和潛在不兼容的功能,可以不影響依賴於較舊的功能的應用程序。
下一步驟就是選擇將由該服務暴露(展示)的資源。這是一個十分簡單地應用,我們只有任務,因此在我們待辦事項中唯一的資源就是任務。
我們的任務資源將要使用 HTTP 方法如下:
========== =============================================== =============================
HTTP 方法 URL 動作
========== =============================================== ==============================
GET http://[hostname]/todo/api/v1.0/tasks 檢索任務列表
GET http://[hostname]/todo/api/v1.0/tasks/[task_id] 檢索某個任務
POST http://[hostname]/todo/api/v1.0/tasks 創建新任務
PUT http://[hostname]/todo/api/v1.0/tasks/[task_id] 更新任務
DELETE http://[hostname]/todo/api/v1.0/tasks/[task_id] 刪除任務
========== ================================================ =============================
我們定義的任務有如下一些屬性:
id: 任務的唯一標識符。數字類型。
title: 簡短的任務描述。字元串類型。
description: 具體的任務描述。文本類型。
done: 任務完成的狀態。布爾值。
目前為止關於我們的 web service 的設計基本完成。剩下的事情就是實現它!
Flask 框架的簡介
如果你讀過 Flask Mega-Tutorial 系列,就會知道 Flask 是一個簡單卻十分強大的 Python web 框架。
在我們深入研究 web services 的細節之前,讓我們回顧一下一個普通的 Flask Web 應用程序的結構。
我會首先假設你知道 Python 在你的平台上工作的基本知識。 我將講解的例子是工作在一個類 Unix 操作系統。簡而言之,這意味著它們能工作在 Linux,Mac OS X 和 Windows(如果你使用Cygwin)。 如果你使用 Windows 上原生的 Python 版本的話,命令會有所不同。
讓我們開始在一個虛擬環境上安裝 Flask。如果你的系統上沒有 virtualenv,你可以從 上下載:
$ mkdir todo-api
$ cd todo-api
$ virtualenv flask
New python executable in flask/bin/python
Installing setuptools……………………….done.
Installing pip……………….done.
$ flask/bin/pip install flask
既然已經安裝了 Flask,現在開始創建一個簡單地網頁應用,我們把它放在一個叫 app.py 的文件中:
#!flask/bin/pythonfrom flask import Flaskapp = Flask(__name__)@app.route(‘/’)def index():
return “Hello, World!”if __name__ == ‘__main__’:
app.run(debug=True)
為了運行這個程序我們必須執行 app.py:
$ chmod a+x app.py
$ ./app.py
* Running on
* Restarting with reloader
現在你可以啟動你的網頁瀏覽器,輸入 看看這個小應用程序的效果。
簡單吧?現在我們將這個應用程序轉換成我們的 RESTful service!
使用 Python 和 Flask 實現 RESTful services
使用 Flask 構建 web services 是十分簡單地,比我在 Mega-Tutorial 中構建的完整的服務端的應用程序要簡單地多。
在 Flask 中有許多擴展來幫助我們構建 RESTful services,但是在我看來這個任務十分簡單,沒有必要使用 Flask 擴展。
我們 web service 的客戶端需要添加、刪除以及修改任務的服務,因此顯然我們需要一種方式來存儲任務。最直接的方式就是建立一個小型的資料庫,但是資料庫並不是本文的主體。學習在 Flask 中使用合適的資料庫,我強烈建議閱讀 Mega-Tutorial。
這裡我們直接把任務列表存儲在內存中,因此這些任務列表只會在 web 伺服器運行中工作,在結束的時候就失效。 這種方式只是適用我們自己開發的 web 伺服器,不適用於生產環境的 web 伺服器, 這種情況一個合適的資料庫的搭建是必須的。
我們現在來實現 web service 的第一個入口:
#!flask/bin/pythonfrom flask import Flask, jsonifyapp = Flask(__name__)tasks = [
{
‘id’: 1,
‘title’: u’Buy groceries’,
‘description’: u’Milk, Cheese, Pizza, Fruit, Tylenol’,
‘done’: False
},
{
‘id’: 2,
‘title’: u’Learn Python’,
‘description’: u’Need to find a good Python tutorial on the web’,
‘done’: False
}]@app.route(‘/todo/api/v1.0/tasks’, methods=[‘GET’])def get_tasks():
return jsonify({‘tasks’: tasks})if __name__ == ‘__main__’:
app.run(debug=True)
正如你所見,沒有多大的變化。我們創建一個任務的內存資料庫,這裡無非就是一個字典和數組。數組中的每一個元素都具有上述定義的任務的屬性。
取代了首頁,我們現在擁有一個 get_tasks 的函數,訪問的 URI 為 /todo/api/v1.0/tasks,並且只允許 GET 的 HTTP 方法。
這個函數的響應不是文本,我們使用 JSON 數據格式來響應,Flask 的 jsonify 函數從我們的數據結構中生成。
使用網頁瀏覽器來測試我們的 web service 不是一個最好的注意,因為網頁瀏覽器上不能輕易地模擬所有的 HTTP 請求的方法。相反,我們會使用 curl。如果你還沒有安裝 curl 的話,請立即安裝它。
通過執行 app.py,啟動 web service。接著打開一個新的控制台窗口,運行以下命令:
$ curl -i
HTTP/1.0 200 OK
Content-Type: application/json
Content-Length: 294
Server: Werkzeug/0.8.3 Python/2.7.3
Date: Mon, 20 May 2013 04:53:53 GMT
{
“tasks”: [
{
“description”: “Milk, Cheese, Pizza, Fruit, Tylenol”,
“done”: false,
“id”: 1,
“title”: “Buy groceries”
},
{
“description”: “Need to find a good Python tutorial on the web”,
“done”: false,
“id”: 2,
“title”: “Learn Python”
}
]
}
我們已經成功地調用我們的 RESTful service 的一個函數!
現在我們開始編寫 GET 方法請求我們的任務資源的第二個版本。這是一個用來返回單獨一個任務的函數:
from flask import abort@app.route(‘/todo/api/v1.0/tasks/int:task_id’, methods=[‘GET’])def get_task(task_id):
task = filter(lambda t: t[‘id’] == task_id, tasks)
if len(task) == 0:
abort(404)
return jsonify({‘task’: task[0]})
第二個函數有些意思。這裡我們得到了 URL 中任務的 id,接著 Flask 把它轉換成 函數中的 task_id 的參數。
我們用這個參數來搜索我們的任務數組。如果我們的資料庫中不存在搜索的 id,我們將會返回一個類似 404 的錯誤,根據 HTTP 規範的意思是 「資源未找到」。
如果我們找到相應的任務,那麼我們只需將它用 jsonify 打包成 JSON 格式並將其發送作為響應,就像我們以前那樣處理整個任務集合。
調用 curl 請求的結果如下:
$ curl -i
HTTP/1.0 200 OK
Content-Type: application/json
Content-Length: 151
Server: Werkzeug/0.8.3 Python/2.7.3
Date: Mon, 20 May 2013 05:21:50 GMT
{
“task”: {
“description”: “Need to find a good Python tutorial on the web”,
“done”: false,
“id”: 2,
“title”: “Learn Python”
}
}
$ curl -i
HTTP/1.0 404 NOT FOUND
Content-Type: text/html
Content-Length: 238
Server: Werkzeug/0.8.3 Python/2.7.3
Date: Mon, 20 May 2013 05:21:52 GMT
!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 3.2 Final//EN”
title404 Not Found/title
h1Not Found/h1
pThe requested URL was not found on the server./ppIf you entered the URL manually please check your spelling and try again./p
當我們請求 id #2 的資源時候,我們獲取到了,但是當我們請求 #3 的時候返回了 404 錯誤。有關錯誤奇怪的是返回的是 HTML 信息而不是 JSON,這是因為 Flask 按照默認方式生成 404 響應。由於這是一個 Web service 客戶端希望我們總是以 JSON 格式回應,所以我們需要改善我們的 404 錯誤處理程序:
from flask import make_response@app.errorhandler(404)def not_found(error):
return make_response(jsonify({‘error’: ‘Not found’}), 404)
我們會得到一個友好的錯誤提示:
$ curl -i
HTTP/1.0 404 NOT FOUND
Content-Type: application/json
Content-Length: 26
Server: Werkzeug/0.8.3 Python/2.7.3
Date: Mon, 20 May 2013 05:36:54 GMT
{
“error”: “Not found”
}
接下來就是 POST 方法,我們用來在我們的任務資料庫中插入一個新的任務:
from flask import request@app.route(‘/todo/api/v1.0/tasks’, methods=[‘POST’])def create_task():
if not request.json or not ‘title’ in request.json:
abort(400)
task = {
‘id’: tasks[-1][‘id’] + 1,
‘title’: request.json[‘title’],
‘description’: request.json.get(‘description’, “”),
‘done’: False
}
tasks.append(task)
return jsonify({‘task’: task}), 201
添加一個新的任務也是相當容易地。只有當請求以 JSON 格式形式,request.json 才會有請求的數據。如果沒有數據,或者存在數據但是缺少 title 項,我們將會返回 400,這是表示請求無效。
接著我們會創建一個新的任務字典,使用最後一個任務的 id + 1 作為該任務的 id。我們允許 description 欄位缺失,並且假設 done 欄位設置成 False。
我們把新的任務添加到我們的任務數組中,並且把新添加的任務和狀態 201 響應給客戶端。
使用如下的 curl 命令來測試這個新的函數:
$ curl -i -H “Content-Type: application/json” -X POST -d ‘{“title”:”Read a book”}’
HTTP/1.0 201 Created
Content-Type: application/json
Content-Length: 104
Server: Werkzeug/0.8.3 Python/2.7.3
Date: Mon, 20 May 2013 05:56:21 GMT
{
“task”: {
“description”: “”,
“done”: false,
“id”: 3,
“title”: “Read a book”
}
}
注意:如果你在 Windows 上並且運行 Cygwin 版本的 curl,上面的命令不會有任何問題。然而,如果你使用原生的 curl,命令會有些不同:
curl -i -H “Content-Type: application/json” -X POST -d “{“””title”””:”””Read a book”””}”
當然在完成這個請求後,我們可以得到任務的更新列表:
$ curl -i
HTTP/1.0 200 OK
Content-Type: application/json
Content-Length: 423
Server: Werkzeug/0.8.3 Python/2.7.3
Date: Mon, 20 May 2013 05:57:44 GMT
{
“tasks”: [
{
“description”: “Milk, Cheese, Pizza, Fruit, Tylenol”,
“done”: false,
“id”: 1,
“title”: “Buy groceries”
},
{
“description”: “Need to find a good Python tutorial on the web”,
“done”: false,
“id”: 2,
“title”: “Learn Python”
},
{
“description”: “”,
“done”: false,
“id”: 3,
“title”: “Read a book”
}
]
}
剩下的兩個函數如下所示:
@app.route(‘/todo/api/v1.0/tasks/int:task_id’, methods=[‘PUT’])def update_task(task_id):
task = filter(lambda t: t[‘id’] == task_id, tasks)
if len(task) == 0:
abort(404)
if not request.json:
abort(400)
if ‘title’ in request.json and type(request.json[‘title’]) != unicode:
abort(400)
if ‘description’ in request.json and type(request.json[‘description’]) is not unicode:
abort(400)
如何通過python調用新浪微博的API
1.下載SDK
使用python調用API的話,首先要去下一個Python的SDK,sinaweibopy
連接地址在此:
可以使用pip很快的導入,github連接里的wiki也有入門的使用方法,很容易看懂。
2.理解新浪微博的授權機制
在調用API之前,首先要搞懂什麼叫OAuth 2,即新浪微博的授權機制,
連接在此:
3.在新浪微博註冊應用
每個人都可以通過新浪微博開發者平台註冊自己的應用,我註冊的是站內應用。註冊後會為每個應用分配唯一的app key 和 app secret,這在上文提到的授權機制中需要用到,相當與每個應用的標示吧。
至此,我們可以嘗試寫代碼調用新浪微博的API啦。
4.簡單的調用API實例
參考了往上很多資料和文檔,寫了一個簡單的調用過程。
# _*_ coding: utf-8 _*_
from weibo import APIClient
import webbrowser
APP_KEY = ”
APP_SECRET = ”
CALLBACK_URL = ”
#這個是設置回調地址,必須與那個」高級信息「里的一致
client = APIClient(app_key=APP_KEY, app_secret=APP_SECRET, redirect_uri=CALLBACK_URL)
url = client.get_authorize_url()
# TODO: redirect to url
#print url
webbrowser.open_new(url)
# 獲取URL參數code:
code = ‘2fc0b2f5d2985db832fa01fee6bd9316’
client = APIClient(app_key=APP_KEY, app_secret=APP_SECRET, redirect_uri=CALLBACK_URL)
r = client.request_access_token(code)
access_token = r.access_token # 新浪返回的token,類似abc123xyz456
expires_in = r.expires_in # token過期的UNIX時間:
# TODO: 在此可保存access token
client.set_access_token(access_token, expires_in)
print client.friendships.friends.bilateral.ids.get(uid = 12345678)
通過以上的代碼,我實現了調用相互關注API的調用,即查找與某個id的用戶相互關注的人的列表。
其中,APP_KEY和APP_SECRET就是前文中分配給每個應用的信息,回調地址在每個應用的高級信息中可以看到,需要自己設置,不過隨便設置一下就好
比較噁心的是code的獲取,我一開始看sinaweibopy的文檔的時候也沒弄懂是什麼意思,如上面的代碼所示,url得到的是一個授權的網址,我們通過
webbrowser.open_new(url)
這行代碼打開瀏覽器跳轉到授權的界面,然後觀察所在界面的網址,會顯示大概如下一樣的格式:
看到了嗎? 問號後面有一個code=……的一個東西,把等號後面的字元串拷貝下來賦給code就可以了,但是每次運行程序是code不是一成不變的,也就是說每次都要有這麼一個手動獲取的過程,我覺得很麻煩,以後自己再研究一下,實現自動獲取code就好了。如果能有哪位大神告訴我,感激不盡~
好了,得到正確的code之後就可以完成授權認證,也就可以調用微博的API啦,至於如何在Python下調用,我拷貝一下sinaweibopy上的介紹:
首先查看新浪微博API文檔,例如:
API:statuses/user_timeline
請求格式:GET
請求參數:
source:string,採用OAuth授權方式不需要此參數,其他授權方式為必填參數,數值為應用的AppKey?。
access_token:string,採用OAuth授權方式為必填參數,其他授權方式不需要此參數,OAuth授權後獲得。
uid:int64,需要查詢的用戶ID。
screen_name:string,需要查詢的用戶昵稱。
(其它可選參數略)
調用方法:將API的「/」變為「.」,根據請求格式是GET或POST,調用get ()或post()並傳入關鍵字參數,但不包括source和access_token參數:
r = client.statuses.user_timeline.get(uid=123456)
for st in r.statuses:
print st.text
若為POST調用,則示例代碼如下:
r = client.statuses.update.post(status=u’測試OAuth 2.0發微博’)
若需要上傳文件,傳入file-like object參數,示例代碼如下:
f = open(‘/Users/michael/test.png’, ‘rb’)
r = client.statuses.upload.post(status=u’測試OAuth 2.0帶圖片發微博’, pic=f)
f.close() # APIClient不會自動關閉文件,需要手動關閉
請注意:上傳的文件必須是file-like object,不能是str,因為無法區分一個str是文件還是欄位。可以通過StringIO把一個str包裝成file-like object
希望我的回答對你有幫助,望採納。
python介面自動化腳本請求添加token信息2018-06-22
注意:以下只是方法過程,具體變數參數得根據你們自己實際
import requests #導入包
header= {‘Authorization’:self.token} #在頭信息中添加token
param = {‘productId’:617,’currentUserId’:1143}#這裡是介面要傳的參數,我用字典傳
response = requests.post(self.url_add_Record,params=param,headers=header,) #發送requests介面請求將url、params、heads傳進去
res = response.json()#返回的response轉化成json串
print(res) #列印res
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/259582.html