一次性实现:http请求方法体+gson的model的工具:HttpMaster

jopen 9年前

一次性实现: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.open-open.com/lib/view/home/1439125560817