一次性實現:http請求方法體+gson的model的工具:HttpMaster
一次性實現:http請求方法體+gson的model的工具
前言
Android的網絡操作是很常見的,而且網絡請求的方法體都是類似的,我希望能創造一個工具,通過一個回車鍵就寫好網絡請求的方法體,生成用于 gson解析的model,順便再寫好測試用例什么的。希望能通過這個工具減少模板式的代碼。于是HttpMaster就誕生了!
本工具中產生gson的model的算法是copy:https://jsontojava.appspot.com/ 中算法實現的,感謝這個優秀的項目。
示例
如何使用
這個應用程序就是android的程序,推薦配合ARC(在chrome中運行apk的插件)使用。
ARC的下載說明:http://www.cnblogs.com/tianzhijiexian/p/4702327.html
運行起ARC后導入這個應用的apk文件即可。
轉換為符合自己項目的工具
因為本工具僅僅是實現了比較通用的模板,不能夠滿足所以的項目需要,目前有如下兩種方式來轉換為符合自己項目的方法體。
1. 簡單 將您的項目的http管理類繼承HttpRequest來做網絡請求,網絡請求的返回值用HttpResponse做。這種方式雖然很簡單,但需要引入本開源項目中的如下三個類:
2.復雜
請復寫:kale.http.framework.presenter.class這個類中的protected方法。這樣就可以為自己的項目定制一套方法體了。
/** * 生成Post方法體的方法 * * // 無參數 * private void postFunction(HttpResponse<RootClass> response) { * mHttpRequest.doPost("url", RootClass.class, response); * } * * // 有參數 * private void postFunction(String param, HttpResponse<Object> response) { * HashMap<String, String> map = new HashMap<>(); * map.put("defaultKey", "defaultValue"); * map.put("param", param); * mHttpRequest.doPost("url", map, null, response); * } * * defaultParamMap 默認參數 * originParamMap 全部的請求參數 */ protected String getPostMethodBlock(String url, Map<String, String> defaultParamMap, Map<String, String> originParamMap, StringBuilder sb, boolean hasModel) { String modelClass = hasModel ? "RootClass.class" : "null"; String modelType = hasModel ? "RootClass" : "Object"; // 無參數 if (originParamMap.size() == 0) { sb.append(" private void function(HttpResponse<").append(modelType).append("> response) {\n") .append(" mHttpRequest.doPost(\"").append(url).append("\", ").append(modelClass).append(", response);\n") .append(" }"); return sb.toString(); } // 有參數 sb.append(" private void function("); for (Map.Entry<String, String> entry : originParamMap.entrySet()) { if (defaultParamMap.get(entry.getKey()) == null) { sb.append("String ").append(WordUtil.underlineToCamel(entry.getKey())).append(", "); } } sb.append("HttpResponse<").append(modelType).append("> response) {\n") .append(" HashMap<String, String> map = new HashMap<>();\n"); for (Map.Entry<String, String> entry : defaultParamMap.entrySet()) { sb.append(" map.put(\"").append(entry.getKey()).append("\", \"").append(entry.getValue()).append("\");\n"); } for (Map.Entry<String, String> entry : originParamMap.entrySet()) { if (defaultParamMap.get(entry.getKey()) == null) { sb.append(" map.put(\"").append(entry.getKey()).append("\", ").append(WordUtil.underlineToCamel(entry.getKey())) .append(");\n"); } } sb.append(" mHttpRequest.doPost(\"").append(url).append("\", map, \n ").append(modelClass).append(", " + "response);\n") .append(" }"); return sb.toString(); } /** * 生成Get方法體的方法 * * // 無參數 * private void getFunction(HttpResponse<RootClass> response) { * mHttpRequest.doGet("url", RootClass.class, response); * } * * // 有參數 * private void getFunction(String param, HttpResponse<Object> response) { * mHttpRequest.doGet("url? * param="+param+"&defaultKey=defaultValue", null, response); * } * * defaultParamMap 默認參數 * originParamMap 全部的請求參數 */ protected String getGetMethodBlock(String url, Map<String, String> defaultParamMap, Map<String, String> originParamMap, StringBuilder sb, boolean hasModel) { String modelClass = hasModel ? "RootClass.class" : "null"; String modelType = hasModel ? "RootClass" : "Object"; // 無參數 if (originParamMap.size() == 0) { sb.append(" private void function(HttpResponse<").append(modelType).append("> response) {\n") .append(" mHttpRequest.doGet(\"").append(url).append("\", ").append(modelClass).append(", response);\n") .append(" }"); return sb.toString(); } // 有參數 sb.append(" private void function("); for (Map.Entry<String, String> entry : originParamMap.entrySet()) { if (defaultParamMap.get(entry.getKey()) == null) { sb.append("String ").append(WordUtil.underlineToCamel(entry.getKey())).append(", "); } } sb.append("HttpResponse<").append(modelType).append("> response) {\n"); sb.append(" mHttpRequest.doGet(\"").append(url).append("?\"\n + \""); for (Map.Entry<String, String> entry : defaultParamMap.entrySet()) { sb.append(entry.getKey()).append("=").append(entry.getValue()).append("&"); } for (Map.Entry<String, String> entry : originParamMap.entrySet()) { if (defaultParamMap.get(entry.getKey()) == null) { sb.append(entry.getKey()).append("=\" + ").append(WordUtil.underlineToCamel(entry.getKey())).append("\n" + " + \"&"); } } sb.deleteCharAt(sb.length() - 1); sb.deleteCharAt(sb.length() - 1); sb.deleteCharAt(sb.length() - 1); sb.deleteCharAt(sb.length() - 1); sb.append(", ").append(modelClass).append(", response);\n").append(" }"); return sb.toString(); }
如果對json數據的解析有不同的處理,可以去復寫kale.http.framework.presenter.class中的getJsonStr方法,最終只需要返回一個json格式的string即可。
/** * 得到jsonString */ protected String getJsonStr(JsonToJava jsonToJava) throws IOException { jsonToJava.addOutputOption(OutputOption.GSON); // Include Gson Annotations //jsonToJava.addOutputOption(OutputOption.PARCELABLE); // Implement Parcelable //jsonToJava.addOutputOption(OutputOption.TO_STRING); // Override toString() /** * 通過之前設置好的url得到jsonString。 * 【復寫提示】 * 通過jsonToJava.fetchUrlResponse()得到url返回的內容,進行第一次解析, * 最終返回的是一個jsonString就行。 */ return jsonToJava.fetchUrlResponse(); }
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!