一次性實現:http請求方法體+gson的model的工具:HttpMaster

jopen 9年前發布 | 11K 次閱讀 Android開發 移動開發 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();
    }

項目主頁:http://www.baiduhome.net/lib/view/home/1439125560817

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!