使用GeneXus做開發做了有一段時間了 卻發現一個問題(O_O)?就是除了相關的Wiki外 網上其他地方的相關資料都很少 於是乎我就想在這記錄一些東西 來幫助以后會用到的人(°ー°〃)
那么第一個問題:什么是GeneXus ?? w(゚Д゚)w?
這個問題我想大部分人都很陌生 首先可能先入為主的以為是一個技術 但是無論是從貼吧圈子里都很少或者說幾乎沒聽過這個詞語 對吧?其實這個GeneXus是一款從國外傳進來的開發工具ㄟ( ▔, ▔ )ㄏ
欸 Σ(⊙▽⊙"a 現在主流的語言都會有自己的一個配套的開發工具 Java有Idea C#有Vs 安卓有自己的Android Studio 等等諸如此類的 那么這是不是某種語言的開發工具呢?
其實也不是-_-||使用它的話可以同時開發javaC# 以及安卓 IOS等應用程序 是不是聽得很奇怪 這都不是一個平台的東西 PS:(ˉ▽ ̄~) 切~~ C#天下第一!!破音!~( ̄0 ̄)/ 請繼續往下看
首先傳統模式的開發由於受成本的控制,不可能所有開發人員都是經驗非常豐富的。人員能力參差不齊導致代碼 Bug非常多 其次就是隨着多元化的時代的腳步 公司人員投入的成本也很大
比如一個項目可能就需要公司的前端設計+后端開發服務然后是其他的公司的測試啊什么的 或者說一個人身上需要參與着幾個項目 比如這個項目還需要用到IOS開發 這時候公司又沒有 這類人員
公司招了一個 寫完這個項目又不需要了 然后踢了 哈哈哈哈哈╮(╯▽╰)╭ 又不是沒有這樣的事 這個時候GeneXus的作用就體現出來了 首先比如一個項目可能前后需要10個人參與 那么按照我們的要求 使用GeneXus的團隊只需要3個人 !!理由如下:
1.幾乎全自動化的代碼生成:我們使用的過程中只需要關注邏輯代碼的編寫 其底層的代碼完全由GeneXus替代 相當於你告訴它(我想吃雪糕 你從抽屜里拿錢 然后過馬路 過馬路時注意車輛 和店員說買個雪糕 藍莓味的 然后回來給我)剩下的事情不需要操心 它自動幫你完成 只要邏輯沒問題 那么就不會發生代碼層級的bug.
2.代碼的復用性: 我們只需要寫一套業務邏輯 這套代碼就能直接生成安卓、IOS 、C# 以及Java端的應用 Σ( ° △ °|||)︴ 沃日!唯一可能改變的就只有頁面的布局之類的 但是不用急請繼續往下看
3.提供各種Web及移勱端UI模板,模塊化配置 里面自帶了各種Web端的UI設計 不僅如此 移動端IOS 和安卓 WebForm 甚至到塞班系統都有集成 選個模板修修改改就可以了 當然 你完全可以自己找一個UI設計
畫出你想要的 然后 拖拉拽 OK 你沒看錯 是直接拖拉拽 然后改一下名字顯示 綁定一下變量或者Grid 然后把之前Web端寫好的邏輯挪過來 點擊安卓環境 生成 完事..... 超方便的說 (* ̄ω ̄)
4.最后就是簡單易學,學習GeneXus只要掌插各個對象的使用方法就可以,不用陷入各種不同技術的細節中。因為之前我就說過 GeneXus有自己的技術團隊 會把當下熱門的技術進行學習了解摸透 然后通過自己的方式集成到IDE中
我們要做的就只有調用就好了 這么說你可能還沒有明確的概念 我舉個簡單的例子吧 比如現在我調用一個接口獲取電話號碼的歸屬地 當然這里只是舉個例子 C#代碼如下 這里我用的是聚合數據的參考代碼
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.IO; using Xfrog.Net; using System.Diagnostics; using System.Web; namespace ConsoleAPI { class Program { static void Main(string[] args) { string url = "http://apis.juhe.cn/mobile/get"; var parameters = new Dictionary<string, string>(); parameters.Add("phone" , "13429667914"); //需要查詢的手機號碼 parameters.Add("key", "您申請的ApiKey");//你申請的key string result = sendPost(url, parameters, "get"); // 代碼中JsonObject類下載地址:http://download.csdn.net/download/gcm3206021155665/7458439 JsonObject newObj = new JsonObject(result); String errorCode = newObj["error_code"].Value; if (errorCode == "0") { Debug.WriteLine("成功"); Debug.WriteLine(newObj); } else { //Debug.WriteLine("請求異常"); Debug.WriteLine(newObj["error_code"].Value+":"+newObj["reason"].Value); } } /// <summary> /// Http (GET/POST) /// </summary> /// <param name="url">請求URL</param> /// <param name="parameters">請求參數</param> /// <param name="method">請求方法</param> /// <returns>響應內容</returns> static string sendPost(string url, IDictionary<string, string> parameters, string method) { if (method.ToLower() == "post") { HttpWebRequest req = null; HttpWebResponse rsp = null; System.IO.Stream reqStream = null; try { req = (HttpWebRequest)WebRequest.Create(url); req.Method = method; req.KeepAlive = false; req.ProtocolVersion = HttpVersion.Version10; req.Timeout = 60000; req.ContentType = "application/x-www-form-urlencoded;charset=utf-8"; byte[] postData = Encoding.UTF8.GetBytes(BuildQuery(parameters, "utf8")); reqStream = req.GetRequestStream(); reqStream.Write(postData, 0, postData.Length); rsp = (HttpWebResponse)req.GetResponse(); Encoding encoding = Encoding.GetEncoding(rsp.CharacterSet); return GetResponseAsString(rsp, encoding); } catch (Exception ex) { return ex.Message; } finally { if (reqStream != null) reqStream.Close(); if (rsp != null) rsp.Close(); } } else { //創建請求 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url + "?" + BuildQuery(parameters, "utf8")); //GET請求 request.Method = "GET"; request.ReadWriteTimeout = 5000; request.ContentType = "text/html;charset=UTF-8"; HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Stream myResponseStream = response.GetResponseStream(); StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8")); //返回內容 string retString = myStreamReader.ReadToEnd(); return retString; } } /// <summary> /// 組裝普通文本請求參數。 /// </summary> /// <param name="parameters">Key-Value形式請求參數字典</param> /// <returns>URL編碼后的請求數據</returns> static string BuildQuery(IDictionary<string, string> parameters, string encode) { StringBuilder postData = new StringBuilder(); bool hasParam = false; IEnumerator<KeyValuePair<string, string>> dem = parameters.GetEnumerator(); while (dem.MoveNext()) { string name = dem.Current.Key; string value = dem.Current.Value; // 忽略參數名或參數值為空的參數 if (!string.IsNullOrEmpty(name))//&& !string.IsNullOrEmpty(value) { if (hasParam) { postData.Append("&"); } postData.Append(name); postData.Append("="); if (encode == "gb2312") { postData.Append(HttpUtility.UrlEncode(value, Encoding.GetEncoding("gb2312"))); } else if (encode == "utf8") { postData.Append(HttpUtility.UrlEncode(value, Encoding.UTF8)); } else { postData.Append(value); } hasParam = true; } } return postData.ToString(); } /// <summary> /// 把響應流轉換為文本。 /// </summary> /// <param name="rsp">響應流對象</param> /// <param name="encoding">編碼方式</param> /// <returns>響應文本</returns> static string GetResponseAsString(HttpWebResponse rsp, Encoding encoding) { System.IO.Stream stream = null; StreamReader reader = null; try { // 以字符流的方式讀取HTTP響應 stream = rsp.GetResponseStream(); reader = new StreamReader(stream, encoding); return reader.ReadToEnd(); } finally { // 釋放資源 if (reader != null) reader.Close(); if (stream != null) stream.Close(); if (rsp != null) rsp.Close(); } } } }
是不是很麻煩?當然現在可能你們公司都有大佬寫好了一些東西 不用寫這么多代碼來調用但是相比於GeneXus調用 簡單
//拼接聚合API調用地址 &vUrlStr = "apis.juhe.cn/mobile/get?" //拼接參數:手機號 &vUrlStr = &vUrlStr +"phone="+&iPhone //拼接參數:APPKEY &vUrlStr = &vUrlStr +"&key=1234567890" //拼接參數:dtype(默認json) &vUrlStr = &vUrlStr +"&dtype=" //調用聚合API調用地址 &httpclient.Host = &vUrlStr &httpclient.Execute('GET', '') &result = &httpclient.ToString() //接口返回Json &oResult.FromJson(&result)
通過定義變量然后拼接接口需要的參數調用內置函數&httpclient以及他的一些屬性最后用內置函數FromJson解析返回的Json數據就結束了 炒雞簡單
當然簡簡單單這么些篇幅完全不能夠介紹完GeneXus所擁有的能力 接下來我會將一些東西慢慢展示給你們大家