生信同學API和SDK學習筆記

引子

API和SDK作為強大的技術(shù),目前在互聯(lián)網(wǎng)行業(yè)中被廣泛使用。然而在生物信息行業(yè)中,對其了解、掌握和使用的人卻很少。故作為GeneDock生物信息工程師的本文作者,希望通過這個博客,記錄自己學習API和SDK的心得,也幫助更多其他生物信息從業(yè)人員使用它。

背景介紹

什么是API?

API(Application Programming Interface)是一組規(guī)則、協(xié)議或工具,清楚地定義了不同軟件部分之間通信的方法。其將應用程序(application)的實現(xiàn)過程隱藏,只暴露調(diào)用所必須的部分,供其他開發(fā)者使用。

舉個例子,大部分人都不知道投影儀的實現(xiàn)過程和原理,但是很多人都可以按照產(chǎn)品說明書,將電腦通過數(shù)據(jù)線連接到投影儀上,最終放映幻燈片。

相似地,你可能不知道一個應用程序(例如google map)的實現(xiàn)過程和原理,但是通過閱讀API文檔、調(diào)用API,你就可以方便地使用這個應用程序。

再進一步,GeneDock平臺也提供了APISDK,您可以不知道GeneDock產(chǎn)品的實現(xiàn)過程、數(shù)據(jù)庫結(jié)構(gòu)、后臺代碼,只需調(diào)用GeneDock的API,就可以方便地、自動地使用我們GeneDock系統(tǒng)了。

什么是SDK?

SDK(Software Development Kit)往往是對一個或者多個API的封裝,形成軟件包,更進一步地方便其他開發(fā)者使用。不同的編程語言會有不同版本的SDK(例如GeneDock目前提供pythonjava版本的SDK),但是調(diào)用的是同一套API。

什么是Web API?

Web API是一種應用在互聯(lián)網(wǎng)領(lǐng)域的API。目前很多互聯(lián)網(wǎng)應用通常使用“客戶端-服務端模式”(client-server model):客戶端(例如chrome等瀏覽器)根據(jù)服務入口(endpoint),發(fā)送請求(request),后端接受請求后做出相應的響應(response)。

舉個例子,打開瀏覽器,在地址欄中輸入“https://genedock.com”,點擊回車,會返回GeneDock的首頁。這個過程可以分解為:

  1. 您的瀏覽器(客戶端client-side)通過URL(服務入口endpoint)向GeneDock后端(服務端server-side)發(fā)送了一個“獲取首頁”的請求(request);
  2. GeneDock后端服務做出響應(response)返回一個html文件;
  3. 該文件經(jīng)過瀏覽器渲染,即是您看到的GeneDock首頁了。

實際的過程可能是多次請求-響應,但是整體邏輯類似。

什么是RESTful API?

RESTfull API是一套web API的設計風格或理論,它對API設計進行了規(guī)定和限制。符合REST風格的API會更方便、更簡潔、更可靠。

基于資源(Resource Based)

例如,RESTful API會規(guī)定,API的設計要基于資源而非動作,基于名詞而非動詞。

舉個例子,GeneDock的API基于工具、工作流任務進行設計,而不會基于創(chuàng)建(create)、更新(put)、刪除(delete)或者給出列表(list)來設計。

統(tǒng)一接口(Uniform Interface)

使用HTTP動詞(HTTP verbs)來表示動作,使用含有資源名稱的URI,響應(HTTP response)包含狀態(tài)碼(status)和內(nèi)容(body)。

常用的HTTP動詞

動詞 解釋
GET 類似于獲取
POST 類似于創(chuàng)建
PUT 類似于更新
DELETE 類似于刪除


常用的狀態(tài)碼

狀態(tài)嗎 解釋
2xx 成功
4xx 客戶端錯誤
5xx 服務端錯誤

實際操作

使用python調(diào)用ListTool API

介紹完上邊的一些背景知識,我們具體演示一下,通過pythonrequests包調(diào)用GeneDock的ListTool API來獲取某一賬號下的工具列表。

注意,本文使用python,其他編程語言也有類似功能,但是限于作者能力,目前只演示python版本。另,本文使用python 2.7版本,python 3以上操作類似。

安裝requests包

通過python的包管理工具pip安裝requests包。

				
1
				
pip install requests

請求簽名

調(diào)用GeneDock API,首先要進行請求簽名,以保證數(shù)據(jù)的安全性。但是,由于請求簽名算法比較復雜,而且具體步驟我也不太懂,此處略去。

您可以直接復制下方代碼(定義了一個供requests包直接進行請求簽名的GeneDockAuth類),或使用我們的python SDK(后邊會介紹)。

具體算法可以參考我們的API文檔-請求簽名。

				
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
				
#!/usr/bin/env python
# coding=utf8
import time
import hashlib
import hmac
import base64
import requests
HEADER_PREFIX = "x-gd-"
AUTH_PREFIX = "GeneDock"
# 從URL中獲取資源表示
def extract_resource_from_url(url):
if url.lower().startswith("http://"):
idx = url.find('/', 7, -1)
return url[idx:].strip()
elif url.lower().startswith("https://"):
idx = url.find('/', 8, -1)
return url[idx:].strip()
else:
return url.strip()
# 標準化資源表示
def canonicalize_resource(resource):
res_list = resource.split("?")
if len(res_list) <= 1 or len(res_list) > 2:
return resource
res = res_list[0]
param = res_list[1]
params = param.split("&")
params = sorted(params)
param = '&'.join(params)
return res + '?' + param
def convert_utf8(input_string):
if isinstance(input_string, unicode):
input_string = input_string.encode('utf-8')
return input_string
# 格式化HTTP頭
def format_header(headers=None):
if not headers:
headers = {}
tmp_headers = {}
for k in headers.keys():
tmp_str = headers[k]
if isinstance(tmp_str, unicode):
tmp_str = convert_utf8(tmp_str)
if k.lower().startswith(HEADER_PREFIX):
k_lower = k.lower().strip()
tmp_headers[k_lower] = tmp_str
else:
tmp_headers[k.strip()] = tmp_str
return tmp_headers
# GeneDockAuth類
class GeneDockAuth(requests.auth.AuthBase):
def __init__(self, access_key_id, access_key_secret, verbose=True):
self.access_key_id = access_key_id
self.access_key_secret = access_key_secret
self.verbose = verbose
def __call__(self, r):
method = r.method
content_type = r.headers.get('Content-Type', '')
content_md5 = r.headers.get('Content-MD5', '')
canonicalized_gd_headers = ""
date = time.strftime("%a, %d %b %Y %H:%M:%S GMT", time.gmtime())
resource = extract_resource_from_url(r.url)
tmp_headers = format_header(r.headers)
if len(tmp_headers) > 0:
x_header_list = tmp_headers.keys()
x_header_list.sort()
for k in x_header_list:
if k.startswith(HEADER_PREFIX):
canonicalized_gd_headers += "%s:%s\n" % (k, tmp_headers[k])
canonicalized_resource = canonicalize_resource(resource)
string_to_sign = method + "\n" + content_md5 + "\n" + content_type + "\n" + date + "\n" + canonicalized_gd_headers + canonicalized_resource
h = hmac.new(self.access_key_secret.encode('utf-8'), string_to_sign, hashlib.sha1)
signature = base64.encodestring(h.digest()).strip()
r.headers["Date"] = date
r.headers["Authorization"] = AUTH_PREFIX + " " + self.access_key_id + ":" + signature
return r

調(diào)用GeneDock ListTool API

定義變量api_endpoint、access_key_id和access_key_secret。

				
1
2
3
				
api_endpoint = "https://cn-beijing-api.genedock.com" # 此處以北京域的API入口為例
access_key_id = "xxxxxxxxxxx" # 您的access_key_id
access_key_secret = "xxxxxxxxxxx" # 您的access_key_secret

由于ListTool API的請求語法是Get /accounts/<account_name>/projects/<project_name>/tools/ HTTP/1.1,為您的賬號名,為項目名,目前為default。

				
1
2
3
4
5
6
				
account_name = "XXXX" # 此處為您的賬號名
project_name = "default" # 此處為項目名,目前為default
api_resource = "/accounts/" + account_name + "/projects/" + project_name + "/tools/"
resp = requests.get(api_endpoint + api_resource,
auth=GeneDockAuth(access_key_id,
access_key_secret))

最終返回的resp變量是一個requests包響應的類requests.models.Response。您可以進一步打印其中變量。

				
1
2
3
				
print resp.status_code # 返回的狀態(tài)碼
print resp.text # 返回的內(nèi)容
print resp.json() # 以json格式展示返回內(nèi)容

如果返回的狀態(tài)碼是200,至此,您就已經(jīng)成功使用python的requests包,通過調(diào)用GeneDock ListTool API,列出了您賬號下的工具。

注意調(diào)用API的響應結(jié)果是json格式,若想形成列表,您可能還需要接著學習python的json包。

使用GeneDock的python SDK調(diào)用ListTool API

正如上文提到的,由于SDK是對一個或者多個API的封裝,因此通過SDK調(diào)用API更加簡單。

安裝GeneDock的python SDK

下載python SDK安裝包,解壓文件后,運行代碼:

				
1
				
python setup.py install

請求簽名

由于python SDK內(nèi)置了用于請求簽名的類GeneDockAuth,故您可以直接使用。

				
1
2
3
4
				
import gdpy
access_key_id = "xxxxxxxxxxx" # 您的access_key_id
access_key_secret = "xxxxxxxxxxx" # 您的access_key_secret
auth = gdpy.GeneDockAuth(access_key_id, access_key_secret)

調(diào)用GeneDock ListTool API

				
1
2
3
4
5
				
api_endpoint = "https://cn-beijing-api.genedock.com" # 此處以北京域的API入口為例
account_name = "XXXX" # 此處為您的賬號名
project_name = "default" # 此處為項目名,目前為default
tool = gdpy.Tools(auth, api_endpoint, account_name, project_name)
list_tool_result = tool.list_tools()

打印結(jié)果

				
1
2
				
print list_tool_result.tools # 查看tool列表詳情
print list_tool_result.count # 列出的tool的數(shù)量

相比與直接調(diào)用API,通過SDK來調(diào)用API,不僅更加方便,而且還提供了很多變量,方便用戶使用。

更多API和SDK的例子可以參考我們的api-referencepython?or?java?SDK手冊。

結(jié)語

通過調(diào)用API和SDK的方法,對于使用者的編程能力是有一定的要求的。但是,一旦掌握,您可以在程序中直接調(diào)用,實現(xiàn)自動化、批量化,極大地方便系統(tǒng)之間的交互,實現(xiàn)強大的功能。

另外,我們目前正在開發(fā)基于SDK的命令行工具(command line tool)進一步來調(diào)用API,屆時使用起來將會更加方便。敬請期待…


閱讀原文:https://www.genedock.com/blog/2017/03/08/api-sdk_for-bioinfo/#container
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,602評論 19 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,138評論 25 708
  • # Python 資源大全中文版 我想很多程序員應該記得 GitHub 上有一個 Awesome - XXX 系列...
    aimaile閱讀 26,838評論 6 427
  • GitHub 上有一個 Awesome - XXX 系列的資源整理,資源非常豐富,涉及面非常廣。awesome-p...
    若與閱讀 19,331評論 4 417
  • 漫游古道,芳草碧連天告別繁華, 領(lǐng)略山外山好一處幽靜雅致的好風景喲過了秦嶺向南看就到了山陽縣 北通到商洛走南是漫川...
    詩緣文字書法部落閱讀 557評論 5 2

友情鏈接更多精彩內(nèi)容