生信同學(xué)API和SDK學(xué)習(xí)筆記

引子

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

背景介紹

什么是API浓若?

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

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

相似地霞丧,你可能不知道一個(gè)應(yīng)用程序(例如google map)的實(shí)現(xiàn)過程和原理,但是通過閱讀API文檔冕香、調(diào)用API蛹尝,你就可以方便地使用這個(gè)應(yīng)用程序后豫。

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

什么是SDK拄衰?

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

什么是Web API妖混?

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

舉個(gè)例子弊予,打開瀏覽器祥楣,在地址欄中輸入“https://genedock.com”,點(diǎn)擊回車汉柒,會(huì)返回GeneDock的首頁误褪。這個(gè)過程可以分解為:

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

實(shí)際的過程可能是多次請(qǐng)求-響應(yīng)正塌,但是整體邏輯類似嘀略。

什么是RESTful API?

RESTfull API是一套web API的設(shè)計(jì)風(fēng)格或理論乓诽,它對(duì)API設(shè)計(jì)進(jìn)行了規(guī)定和限制帜羊。符合REST風(fēng)格的API會(huì)更方便、更簡(jiǎn)潔鸠天、更可靠讼育。

基于資源(Resource Based)

例如,RESTful API會(huì)規(guī)定,API的設(shè)計(jì)要基于資源而非動(dòng)作窥淆,基于名詞而非動(dòng)詞卖宠。

舉個(gè)例子,GeneDock的API基于工具忧饭、工作流扛伍、任務(wù)進(jìn)行設(shè)計(jì),而不會(huì)基于創(chuàng)建(create)词裤、更新(put)刺洒、刪除(delete)或者給出列表(list)來設(shè)計(jì)。

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

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

常用的HTTP動(dòng)詞

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


常用的狀態(tài)碼

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

實(shí)際操作

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

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

注意周偎,本文使用python抹剩,其他編程語言也有類似功能,但是限于作者能力蓉坎,目前只演示python版本澳眷。另,本文使用python 2.7版本蛉艾,python 3以上操作類似钳踊。

安裝requests包

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

				
1
				
pip install requests

請(qǐng)求簽名

調(diào)用GeneDock API勿侯,首先要進(jìn)行請(qǐng)求簽名拓瞪,以保證數(shù)據(jù)的安全性。但是罐监,由于請(qǐng)求簽名算法比較復(fù)雜吴藻,而且具體步驟我也不太懂瞒爬,此處略去弓柱。

您可以直接復(fù)制下方代碼(定義了一個(gè)供requests包直接進(jìn)行請(qǐng)求簽名的GeneDockAuth類),或使用我們的python SDK(后邊會(huì)介紹)侧但。

具體算法可以參考我們的API文檔-請(qǐng)求簽名矢空。

				
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()
# 標(biāo)準(zhǔn)化資源表示
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_endpointaccess_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的請(qǐng)求語法是Get /accounts/<account_name>/projects/<project_name>/tools/ HTTP/1.1屁药,為您的賬號(hào)名,為項(xiàng)目名柏锄,目前為default酿箭。

				
1
2
3
4
5
6
				
account_name = "XXXX" # 此處為您的賬號(hào)名
project_name = "default" # 此處為項(xiàng)目名复亏,目前為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變量是一個(gè)requests包響應(yīng)的類requests.models.Response。您可以進(jìn)一步打印其中變量缭嫡。

				
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耕突,列出了您賬號(hào)下的工具。

注意調(diào)用API的響應(yīng)結(jié)果是json格式评架,若想形成列表眷茁,您可能還需要接著學(xué)習(xí)python的json包

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

正如上文提到的纵诞,由于SDK是對(duì)一個(gè)或者多個(gè)API的封裝上祈,因此通過SDK調(diào)用API更加簡(jiǎn)單。

安裝GeneDock的python SDK

下載python SDK安裝包浙芙,解壓文件后雇逞,運(yùn)行代碼:

				
1
				
python setup.py install

請(qǐng)求簽名

由于python SDK內(nèi)置了用于請(qǐng)求簽名的類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" # 此處為您的賬號(hào)名
project_name = "default" # 此處為項(xiàng)目名塘砸,目前為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手冊(cè)女轿。

結(jié)語

通過調(diào)用API和SDK的方法,對(duì)于使用者的編程能力是有一定的要求的壕翩。但是蛉迹,一旦掌握,您可以在程序中直接調(diào)用放妈,實(shí)現(xiàn)自動(dòng)化北救、批量化,極大地方便系統(tǒng)之間的交互芜抒,實(shí)現(xiàn)強(qiáng)大的功能珍策。

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


閱讀原文:https://www.genedock.com/blog/2017/03/08/api-sdk_for-bioinfo/#container
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蹭劈,更是在濱河造成了極大的恐慌疗绣,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件铺韧,死亡現(xiàn)場(chǎng)離奇詭異持痰,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)祟蚀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門工窍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人前酿,你說我怎么就攤上這事患雏。” “怎么了罢维?”我有些...
    開封第一講書人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵淹仑,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我肺孵,道長(zhǎng)匀借,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任平窘,我火速辦了婚禮吓肋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘瑰艘。我一直安慰自己是鬼,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開白布紫新。 她就那樣靜靜地躺著均蜜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪芒率。 梳的紋絲不亂的頭發(fā)上囤耳,一...
    開封第一講書人閱讀 51,165評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音偶芍,去河邊找鬼充择。 笑死,一個(gè)胖子當(dāng)著我的面吹牛腋寨,可吹牛的內(nèi)容都是我干的聪铺。 我是一名探鬼主播化焕,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼萄窜,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起查刻,我...
    開封第一講書人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤键兜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后穗泵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體普气,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年佃延,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了现诀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡履肃,死狀恐怖仔沿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情尺棋,我是刑警寧澤封锉,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站膘螟,受9級(jí)特大地震影響成福,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜荆残,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一奴艾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧内斯,春花似錦握侧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至备徐,卻和暖如春萄传,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蜜猾。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工秀菱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蹭睡。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓衍菱,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親肩豁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子脊串,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

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