濟(jì)南網(wǎng)站建設(shè)需要多少錢(一文讀懂蘇丹局勢(shì)最新進(jìn)展)一文讀懂蔡徐坤事件始末,
API,應(yīng)用程序編程接口(application programming interface)的縮寫詞,用于從命令行工具到Java、 Ruby on Rails、Web應(yīng)用等程序除非你從頭開始編寫每一行代碼,否則你將與外部軟件組件進(jìn)行交互,每個(gè)組件都有自己的API。
即使你完全從頭開始寫一些東西,一個(gè)精心設(shè)計(jì)的軟件應(yīng)用程序也會(huì)有內(nèi)部API來(lái)幫助組織代碼,并使組件可重用性更高深入研究一下,API是一個(gè)與軟件組件交互的規(guī)范例如,如果一輛汽車是一個(gè)軟件組件,其API將包括有關(guān)加速,制動(dòng)和打開無(wú)線電的能力的信息。
它還包括有關(guān)如何加速的信息:將腳放在加速踏板上并加油API定義將“what”和“how”信息匯集在一起,它是汽車本身的抽象需要記住的一點(diǎn)是,某些API的名稱通常用于指代交互的規(guī)范以及與之交互的實(shí)際軟件組件。
例如,“Twitter API”這個(gè)短語(yǔ)不僅指用于以編程方式與Twitter進(jìn)行交互的規(guī)則集,而且通常被理解為與你交互的內(nèi)容,例如“我們正在分析從Twitter API獲取的推文“讓我們通過(guò)Java API和Twitter API作為示例來(lái)深入研究。
首先,我們將快速了解這兩個(gè)API以及它們?nèi)绾螌?shí)現(xiàn)“what”和“how”的定義然后,我們將討論你何時(shí)可能會(huì)使用API以及如何進(jìn)行精心設(shè)計(jì)APIJava APIJava API是一個(gè)“開箱即用”的軟件組件庫(kù),可供安裝Java開發(fā)工具包的任何人使用。
這些組件執(zhí)行常見的任務(wù),通常會(huì)提高生產(chǎn)力,因?yàn)槌绦騿T不必每次都從頭開始軟件中使用的一個(gè)基本組件是名為L(zhǎng)ist的東西,正如你所期望的那樣,它可以跟蹤項(xiàng)目列表Java API定義了你可以對(duì)List執(zhí)行的操作:添加項(xiàng)目,對(duì)列表進(jìn)行排序,確定項(xiàng)目是否在列表中等。
它還指定如何執(zhí)行這些操作為了對(duì)列表進(jìn)行排序,你需要指定如何排序列表:按字母順序排列,數(shù)字遞減排列,最亮至最暗淡的顏色等
上圖為L(zhǎng)ist的排序方法的OpenJDK API文檔comparator是確定列表如何排序的參數(shù)Twitter APITwitter API是一個(gè)基于Web的JSON API,允許開發(fā)人員以編程方式與Twitter數(shù)據(jù)交互。
與包含在Java開發(fā)工具包中的Java API不同,Twitter API是一個(gè)基于Web的API必須通過(guò)互聯(lián)網(wǎng)向Twitter的服務(wù)提出請(qǐng)求才能訪問它通過(guò)基于Web的API(例如Twitter),你的應(yīng)用程序就像Web瀏覽器一樣發(fā)送HTTP請(qǐng)求。
但是,網(wǎng)頁(yè)提供的響應(yīng),不是為了人類的理解,而是以應(yīng)用程序可以輕松解析的格式返回 為此目的存在各種格式,Twitter使用稱為JSON的流行且易于使用的格式Twitter中的基本元素之一是推文Twitter API告訴你可以用推文做什么:搜索推文,創(chuàng)建推文,最喜歡的推文。
它還會(huì)告訴你如何執(zhí)行這些操作要搜索推文,你需要指定搜索條件:要查找的詞條或主題標(biāo)簽,地理位置,語(yǔ)言等
上圖是Twitter的Search API文檔在這里,你可以找到查詢推文群體所需的所有詳細(xì)信息,包括可用搜索運(yùn)算符以及響應(yīng)格式REST APITwitter API以及許多其他基于Web的API是REST API的一個(gè)例子,也就是說(shuō)它是一種使用Representational State Transfer(REST)架構(gòu)風(fēng)格的API。
REST是由Roy Fielding于2000年在他的博士論文中正式介紹的,它是一套用于構(gòu)建涉及任何類型媒體(文本,視頻等)的分布式系統(tǒng)的架構(gòu)組件,設(shè)計(jì)原則和交互REST的核心是一種構(gòu)建系統(tǒng)的風(fēng)格,它允許跨網(wǎng)絡(luò)靈活地進(jìn)行通信和顯示信息,同時(shí)提供構(gòu)建通用組件的必要結(jié)構(gòu)。
在REST API中,資源幾乎可以是任何東西,示例包括用戶,推文列表以及搜索推文的當(dāng)前結(jié)果這些資源中的每一個(gè)資源都可通過(guò)資源標(biāo)識(shí)符進(jìn)行尋址,對(duì)于基于Web的REST API,通常是一個(gè)URL,例如https://api.twitter.com/1.1/users/show?screen_name=twitterdev。
當(dāng)應(yīng)用程序使用標(biāo)識(shí)符請(qǐng)求資源時(shí),API會(huì)以該應(yīng)用程序可以使用的格式(如JPEG圖像,HTML頁(yè)面或JSON)將該資源的當(dāng)前表示形式傳遞給應(yīng)用程序REST最大的區(qū)別之一是它涉及向請(qǐng)求應(yīng)用程序發(fā)送數(shù)據(jù)雖然這提供了很大的靈活性,但允許應(yīng)用程序根據(jù)數(shù)據(jù)執(zhí)行任何操作,這是以犧牲效率為代價(jià)的。
通過(guò)網(wǎng)絡(luò)發(fā)送數(shù)據(jù)進(jìn)行處理相對(duì)于進(jìn)行數(shù)據(jù)駐留的處理相當(dāng)緩慢,然后發(fā)送結(jié)果當(dāng)然,“高效”方法的問題在于托管數(shù)據(jù)的系統(tǒng)需要知道應(yīng)用程序需要提前做什么因此,為了構(gòu)建具有通用可用性和靈活性的API,REST是一條可行的路線。
API作為抽象層談到軟件,API幾乎無(wú)處不在API與計(jì)算機(jī)科學(xué)中最基本的概念之一是并行的:抽象抽象只是一種組織系統(tǒng)復(fù)雜性的方法,以便以簡(jiǎn)單的方式處理復(fù)雜的操作想象一下這種抽象,就像亞馬遜Dash按鈕,你可以用它來(lái)訂購(gòu)亞馬遜的訂書釘。
這是他們的樣子:
上圖是亞馬遜Dash按鈕的幾個(gè)例子按下按鈕即可訂購(gòu)更多清潔劑或紙巾你可以從亞馬遜的訂購(gòu)Dash按鈕開始,并使用智能手機(jī)上的應(yīng)用程序?qū)⑵渑c你的Wi-Fi網(wǎng)絡(luò),亞馬遜帳戶以及產(chǎn)品(例如你最喜愛的紙巾品牌)相關(guān)聯(lián)。
然后,只要你想訂購(gòu)更多的紙巾,你只需按下Dash按鈕連接到Internet并發(fā)送消息以在你的帳戶上下訂單幾天后,紙巾將抵達(dá)你的家門口就像一個(gè)API,Dash按鈕是一個(gè)非常簡(jiǎn)單的界面,隱藏了幕后的各種復(fù)雜性。
你訂購(gòu)的產(chǎn)品的ID必須從某個(gè)數(shù)據(jù)庫(kù)中檢索你的收貨地址必須從你的帳戶中提取必須確定最近的庫(kù)存紙巾的履約中心,然后通知從現(xiàn)有庫(kù)存中取出物品并將其包裝最后,包裹必須通過(guò)飛機(jī),卡車和貨車以及其他包裹的某種組合來(lái)確保所有包裹都能有效抵達(dá)目的地。
現(xiàn)在假設(shè)作為客戶你必須協(xié)調(diào)所有這些東西,那你絕對(duì)不會(huì)訂購(gòu)紙巾,因?yàn)樗珡?fù)雜、太費(fèi)時(shí),而且你還有更多的事情要做幸運(yùn)的是,整個(gè)考驗(yàn)都是從你身上抽象出來(lái)的計(jì)算機(jī)系統(tǒng)和人員流程之間存在著長(zhǎng)期的相互關(guān)聯(lián)的鏈條,使得這些紙巾出現(xiàn)在你的家門口,但你只需按下按鈕即可。
這就是程序員的API,它們解決了大量的復(fù)雜性,并定義了一組可以利用的相對(duì)簡(jiǎn)單的交互,而不是自己完成所有工作在任何軟件項(xiàng)目中,你都可能直接使用數(shù)十個(gè)甚至數(shù)百個(gè)API,并且每個(gè)API都依賴于其他API等API設(shè)計(jì)
API設(shè)計(jì)是制定API“what”和“how”的過(guò)程與其他任何可以創(chuàng)建的內(nèi)容一樣,API設(shè)計(jì)中會(huì)考慮到不同程度的思考和關(guān)注,從而導(dǎo)致API質(zhì)量水平不同精心設(shè)計(jì)的API具有一致的行為,考慮到其背景,并牢記用戶的需求。
API中的一致行為極大地影響了它的學(xué)習(xí)速度以及程序員在使用時(shí)出錯(cuò)的可能性通常,執(zhí)行類似操作的API應(yīng)該具有相似的行為,無(wú)論其技術(shù)差異如何對(duì)于不一致API的示例,我們來(lái)看看在Java中將項(xiàng)添加到列表的兩種方法:。
即使向列表添加項(xiàng)目的兩種方法執(zhí)行相同的操作,它們的返回類型(布爾值和空值)也是不同的使用此API的開發(fā)人員現(xiàn)在必須跟蹤哪種方法返回哪種類型,從而使API更難以學(xué)習(xí),并且其使用更易于出錯(cuò)這也意味著使用這些方法的代碼變得不那么靈活,因?yàn)槿绻阆胍袚Q添加元素的方式,它必須更改。
考慮到上下文是另一種形式的一致性,盡管它與API的外部因素有關(guān)一個(gè)偉大的,非軟件的例子是道路右側(cè)交通規(guī)則或左側(cè)交通規(guī)則如何影響不同國(guó)家的汽車設(shè)計(jì)當(dāng)駕駛員座椅位于汽車的右側(cè)或左側(cè)時(shí),汽車設(shè)計(jì)師會(huì)考慮到這一環(huán)境因素。
在API設(shè)計(jì)中,考慮到上下文通常意味著你遵守普遍接受的最佳實(shí)踐,并從你的用戶可能熟悉的其他API中獲得靈感假設(shè)你正在構(gòu)建一個(gè)為Java應(yīng)用程序提供了一種新List的庫(kù),也許是一個(gè)專門用于非常大型列表的工具。
該List的API應(yīng)該可能包含一個(gè)add方法,其行為與Java List add方法的工作方式相同這樣,用戶可以輕松采用你的庫(kù),因?yàn)樗麄円呀?jīng)知道如何使用它了解你的用戶并且牢記他們的需求在API設(shè)計(jì)中是至關(guān)重要的。
如果你了解自己的痛點(diǎn)并幫助他們避免這種痛苦,那么你的API將擁有愉悅的用戶出于同樣的原因,你可能會(huì)選擇違反其他良好API設(shè)計(jì)規(guī)則如果你正在編寫Web API,那么今天的事實(shí)標(biāo)準(zhǔn)就是使用JSON作為交換格式。
但是,如果你的API將為正在檢索大量數(shù)據(jù)的科學(xué)用戶提供服務(wù),那么JSON將過(guò)于冗長(zhǎng)而繁瑣地為其提供服務(wù)因此,你可以選擇使用像GRIB這樣的二進(jìn)制格式,即使它在一般意義上是非常罕見的選擇API是軟件設(shè)計(jì)的重要組成部分,它們存在于軟件堆棧的各個(gè)層面。
他們提供了一種方式來(lái)定義和管理抽象,告訴我們我們可以用軟件組件做什么以及如何做到這一點(diǎn)精心設(shè)計(jì)的API支持高效,流暢和輕松的采用和使用,而設(shè)計(jì)不佳的API在每次使用時(shí)都會(huì)引起頭痛