這幾天一直在研究要怎麼將Android與外部的資料庫存取,因為書中都只有講到如何與Android本身的SQLite做存取,可是對於外部資料庫存取的部分卻是少的可憐,拜了一下Google大神也是沒有什麼結論,於是我就自己想了一套還蠻蠢的方法,不過有顧慮到與資料庫存取的安全性啦。

一般我們在網頁存取資料庫的時候,當然都是連到DMZ裡面的web server,然後web server再用各種方式(ADO.NET, ODBC, JDBC......等)與防火牆內的資料庫做存取,可是這僅限於Web應用程式可以如此存取,如果你寫的是手機程式(iPhone APP、Android APP)的話,那這種方法理論是可行,可是實際上是不可行的。

如果想要讓手機程式(這邊以Android為例)讀取外部資料庫時,最簡單的方法就是用JDBC去連外部資料庫,可是這會發生一個安全上的問題。也就是資料庫必須要從防火牆內拉出來放到DMZ,要不然JDBC是永遠都沒辦法存取外部資料庫的,所以就有一堆人想到了,對web server用web service來做存取資料庫的動作,這就解決了安全性的問題,可是在開發時卻還是極為不便。

如果大家有用過Rails開發程式的話,應該對於它那個強大的RESTful機制ORM愛不釋手吧,用ORM來解決了許多操作資料庫的問題,也從最根本的方式用RESTful來存取資料庫。所以我就架了一台可以跑Rails的web server在DMZ,而且因為我只要用到RESTful和ORM而已,所以我將web server從apache改為lighttpd,其實還有其他更輕量的web server,只不過我只會這兩套而已 XD。

再來就是設定Rails的RESTful以及建立DB migration,這些都完成了之後,最後把RESTful的那四個method以及七個action實作出來,這樣子我只要在Android上面寫HTTP method,並且對這一台web server做存取,我就可以完成對外部資料庫的存取了,而且也不用擔心安全性的問題,真是太強大了啦!!!

只不過在寫Android的HTTP method時,發現了一些以前從沒遇到的問題,那就是HTTP status code居然出現了417,這個問題真的是困擾了我很久,後來找到了這篇文章「Remove Expect header in Android’s org.apache.http」,總算是解決了這個鳥問題。

我覺得這個問題真的是還蠻難找出來的,動用了Wireshark, Google Chrome的Developer Tools, tcpdump,還有一堆Rails的log才知道怎麼解決,所以想說寫這篇文章跟大家分享一下實作的架構以及甘苦談 XDDDD,總之大家看了簡報應該就知道怎麼解決囉。

參考資料:
SQLite Home Page
DMZ (computing) - Wikipedia, the free encyclopedia
REST - 維基百科,自由的百科全書
物件關聯對映 - 維基百科,自由的百科全書
lighttpd fly light
List of HTTP status codes - Wikipedia, the free encyclopedia
Wireshark · Go deep.
TCPDUMP/LIBPCAP public repository
kewang 說 用rails的ORM跟RESTful來做為DB存取的web service,然後再用Android來存取這個web service (dance) - #5lpx8m
kewang 說 HTTP Status Code 417讓我找了兩天解決的方法,原來是HTTP header的問題,要移除Expect: 100-continue呀!!! http://overhrd.com/?p= - #5mtbr3

kewang 發表在 痞客邦 留言(0) 人氣()