原創(chuàng)|使用教程|編輯:黃竹雯|2016-08-24 10:18:45.000|閱讀 839 次
概述:你的iOS應用程序需要后端。隨著Parse關閉了商店,現(xiàn)在我們該做什么呢?找到一個Parse替換或建立自己的后端?來看看Moe Burney決定做什么。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關鏈接:
你的iOS應用程序需要后端。隨著Parse關閉了商店,現(xiàn)在我們該做什么呢?找到一個Parse替換或建立自己的后端?
我堅定地站在“學會建立自己的”后端陣營這邊。
許多開發(fā)人員建議不要建立自己的后端。BaaS關閉后,這些開發(fā)商爭相尋找下一個替換BaaS。然后他們也會試圖說服你使用替換BaaS。但我們都知道有些事不可避免的會發(fā)生。有一天你會從你的BaaS提供者處得到一個“驚喜”郵件,通知你他們正好在你的新應用程序版本推出時關閉。
我記得那次也發(fā)生在我身上——一個我依靠的BaaS關閉了。當我第一次看到關閉通知的郵件時,我覺得被利用了。我感到被出賣了。然后我感到很生氣。我陷入了一個惡性循環(huán),我孤立了自己。我吃冰淇淋,邊淋浴邊聽Celine Dion而哭泣。我應該能夠預見這種事的,但是我被方便的幻覺和服務提供的穩(wěn)定誘惑了。但這都只是——一個錯覺。
為什么不可靠的BaaS提供商不斷出現(xiàn)還對我們這樣可憐的移動開發(fā)者這樣做呢?
學習如何建立后端是一項很重的工作。這就是為什么BaaS似乎是一個不錯的選擇。
但如果你想掙脫BaaS的依賴而構建自己的后端,關鍵之處在于:不要試圖了解后端的一切!我們需要從小事做起。
當你創(chuàng)建你的第一個iOS應用程序,你可能沒有專注于讓它成為可伸縮和可維護的。你第一次沒有太多壓力,UITableview單元格得以回收和顯示錯誤的數(shù)據(jù)。你可能并不擔心你的應用是否應該遵循MVC或MVVM或MMVCM(我將其放在最后一個)。我敢打賭你的第一個應用可能從來沒有讓它試過模擬器。
我建議以同樣的方法建立后端:從小事做起。先做一些小事情,無論多么的小。然后在此基礎上進行創(chuàng)建。
你不需要把自己埋在關于Python或Ruby的書里,或者你可以得到一個后端啟動并運行之前學習關于服務器的一切。設計整個API,部署它,擴展它——所有這些事情都可以稍后進行。
首先這樣做:
寫一個會調用你的后端的iOS函數(shù),甚至在你構建后端之前
這是一個例子。假設你決定你的第一個函數(shù)會調用可以檢索一個特定用戶的信息的API。
下面的函數(shù)由Swift編寫,建一個POST請求‘/ get_messages’ 在并不存在(但很快會有的)的本地服務器上。讓我們來看看這個函數(shù)的代碼:
func printMessagesForUser() -> Void { let json = ["user":"larry"] do { let jsonData = try NSJSONSerialization.dataWithJSONObject(json, options: .PrettyPrinted) let url = NSURL(string: "//127.0.0.1:5000/api/get_messages")! let request = NSMutableURLRequest(URL: url) request.HTTPMethod = "POST" request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type") request.HTTPBody = jsonData let task = NSURLSession.sharedSession().dataTaskWithRequest(request){ data, response, error in if error != nil{ print("Error -> \(error)") return } do { let result = try NSJSONSerialization.JSONObjectWithData(data!, options: .AllowFragments) as? [String:AnyObject] print("Result -> \(result)") } catch { print("Error -> \(error)") } } task.resume() } catch { print(error) } }
這段代碼建了一個帶用戶名“larry”的POST請求到“//127.0.0.1:5000/api/get_messages”。當然,如果我們現(xiàn)在運行這段代碼,它是不會運行的,因為我們還沒有創(chuàng)建端點“ttp://127.0.0.1:5000/api/get_messages”。這是下一步我們將要做的。
安裝Flask(如果你還沒有,就用Python)
檢查Python和Flask文檔。
寫后端函數(shù)
現(xiàn)在,我們必須為我們的iOS函數(shù)創(chuàng)建get_messages端點。這是它在默認Flask文件中的樣子,app.py:
@app.route('/api/get_messages', methods = ['POST']) def get_messages(): json = request.get_json() if json['user'] == "larry": return jsonify({'messages':['test1', 'test2']}) return jsonify({'error':'no user found'})
這個Python/Flask存根函數(shù)非常簡單。頂部的@app.route裝飾指定函數(shù)應該對應于‘get_messages’端點,它應該是一個POST請求。 ‘get_messages’函數(shù)的主題檢查request.get_json()——一個Flask函數(shù),返回一個代碼,其中包含POST請求中發(fā)送的值。如果用戶名“larry”的消息是‘user’的請求參數(shù),那么函數(shù)會發(fā)送給客戶端包含一個字符串數(shù)組“test1”和“test2”的JSON對象代碼。
get_messages函數(shù)返回硬編碼JSON,但是以后你可以將它連接到一個真正的數(shù)據(jù)庫。在那之前,運行Flask服務器和iOS客戶端,看看你的后端的第一個構建塊是否能夠運行。接下來我們將這樣做。
運行本地服務器
我們確保app.py有以下的命令:
if __name__ == '__main__': app.run(debug = True)
現(xiàn)在你可以運行app.py來啟動Flask服務器:
Python app.py
這將以默認端口為5000啟動托管在你的本地主機上的Flask服務器。
從你的應用程序調用函數(shù)
其實看到你的后端API返回的東西會給你后端構建冒險繼續(xù)前進的動力。
運行你一開始寫的“getMessages” Swift函數(shù)——把它貼在你的主要視圖控制器或應用程序委托上,然后重構。另外,確保你添加了以下代碼到你的info.plist,這樣你就可以在開發(fā)階段禁用iOS運輸安全需求:
<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
一旦你得到在控制臺上打印出來的數(shù)組{“test1”、“test2”},你就知道你已經(jīng)成功地調用自己的后端。如果你沒有得到這組輸出,就繼續(xù)調整直到你拿到它。
如果你看到了這里,祝賀你。通過更多的“填補空白”(學習一些Python,為數(shù)據(jù)庫查詢插入一個ORM),你現(xiàn)在不需要Parse或任何形式的BaaS服務就可以編寫一個后端。
這是過于簡單化的嗎?是的,我們剛剛編寫的并不是一個完整的后端。適當?shù)腁PI設計、數(shù)據(jù)庫設計、服務器維護和可擴展性都是你將不得不解決的問題,以便你可以繼續(xù)你的旅程。但是如果你這樣開始,那么你已經(jīng)有了一個基礎,你必須控制你自己的系統(tǒng)。相比依賴于可能對你隨時拔掉插頭的另一個第三方提供者,這種控制要好得多。
本文翻譯自:
本站文章除注明轉載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn