Android上執行Http Server
版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/TurkeyCock/article/details/86555919
Android裝置一般是作為客戶端使用,但是最近一個專案需要用android開發板作為伺服器和手機端通訊,因此花了點時間研究了下如何在android上執行http server。
實際上這是有開源解決方案的,叫做AndroidAsync,作者是Koushik Dutta,他的另一個開源專案是大名鼎鼎的ION,這是一個非同步網路圖片載入庫。但是AndroidAsync幾乎沒什麼文件,因此實際使用中遇到了一些問題,記錄下了方便其他有需要的人蔘考。
AndroidAsync中提供了一個AsyncHttpServer類處理網路請求,而我們需要實現HttpServerRequestCallback介面執行實際的業務邏輯,實際上該介面只有一個onRequest()方法。首先我們要為GET/POST方法註冊callback,然後開始監聽埠:
public class ArtemisHttpServer implements HttpServerRequestCallback { public static int PORT_DEFALT = 6789; AsyncHttpServer mServer = new AsyncHttpServer(); public void start() { Log.d(TAG, "Starting http server..."); mServer.get("[\\d\\D]*", this); mServer.post("[\\d\\D]*", this); mServer.listen(PORT_DEFALT); } public void stop() { Log.d(TAG, "Stopping http server..."); mServer.stop(); } }
實際使用時一般使用單例模式,程式碼這裡略去了。接下來就是實現onRequest()方法了:
- 獲取請求路徑:通過request.getPath()
- 獲取GET引數:通過request.getQuery()
- 獲取POST引數:這個比較麻煩,github上也沒有任何參考,經研究發現:
- Form格式:需要把body轉換成AsyncHttpRequestBody<Multimap>
- JSON格式:需要把body轉換成AsyncHttpRequestBody<JSONObject>
@Override public void onRequest(AsyncHttpServerRequest request, AsyncHttpServerResponse response) { String uri = request.getPath(); Log.d(TAG, "onRequest " + uri); Object params; if (request.getMethod().equals("GET")) { params = request.getQuery(); } else if (request.getMethod().equals("POST")) { String contentType = request.getHeaders().get("Content-Type"); if (contentType.equals("application/json")) { params = ((AsyncHttpRequestBody<JSONObject>) request.getBody()).get(); } else { params = ((AsyncHttpRequestBody<Multimap>) request.getBody()).get(); } } else { Log.d(TAG,"Unsupported Method"); return; } if (params != null) { Log.d(TAG, "params = " + params.toString()); } switch (uri) { case "/devices": handleDevicesRequest(params, response); break; default: handleInvalidRequest(params, response); break; } }
得到的引數物件為Multimap或者JSONObject型別,接下來呼叫getString()就可以獲取具體的引數值了:
String id = ""; if (params instanceof Multimap) { id = ((Multimap) params).getString("id"); Log.d(TAG, "[Multimap] id=" + id); } else if (params instanceof JSONObject) { try { Log.d(TAG, params.toString()); id = ((JSONObject) params).getString("id"); } catch (JSONException e) { e.printStackTrace(); return; } Log.d(TAG, "[JSONObject] id=" + id); } else { Log.e(TAG, "Invalid request params"); return; }
後面就是根據path呼叫對應的API進行處理,然後通過response物件傳送響應。如果要支援跨域,可以在response的header中增加欄位:
private void sendResponse(AsyncHttpServerResponse response, JSONObject json) { // Enable CORS response.getHeaders().add("Access-Control-Allow-Origin", "*"); response.send(json); }
完整示例程式碼參見github: https://github.com/qianxin2016/AndroidHttpServer
更多文章歡迎關注“鑫鑫點燈”專欄: https://blog.csdn.net/turkeycock
或關注飛久微信公眾號: