一、API接口的編碼
1、首頁的頁面代碼:
protected void Page_Load(object sender, EventArgs e) { /* * 請求路徑:http://xxxx/index.aspx?appkey=&security=&t=&method=&... * appkey是調用者身份碼(系統分配) * security是當前請求安全碼(安全碼=MD5(Key + Method),key為系統分配或調用者自行設定) * t是請求模塊(Member用戶模塊 Berth泊位模塊 Transaction交易模塊 Operation運維模塊 Equipment設備模塊 Other其他模塊) * method是請求函數 */ Response.Expires = 0;//頁面使用后立即過期 Response.CacheControl = "no-cache";//設置頁面不緩存在臨時文件中. DateTime dtStart = DateTime.Now; if (!IsPostBack) { string strT = SZRPP.Common.SZRPPRequest.GetString("t"); //構造分類請求轉發地址 string strHeadUrl = ConfigurationManager.AppSettings[strT]; string strQueryUrl = strT + "API/Index.aspx"; string strReturn = ""; string strParm = GetAllParameter(); StreamReader sr = null; HttpWebResponse res = null; if (strT != "" && strHeadUrl != "") { try { //請求轉發 // HttpWebRequest 是 WebRequest 的派生類,專門用於 Http HttpWebRequest req = HttpWebRequest.Create(strHeadUrl + strQueryUrl) as System.Net.HttpWebRequest; //設置請求方式 req.Method = "POST"; req.ContentType = "application/x-www-form-urlencoded"; //寫入流對象 StreamWriter requestWriter = new StreamWriter(req.GetRequestStream()); //寫入請求參數 requestWriter.Write(strParm); //釋放寫入流對象 requestWriter.Close(); requestWriter = null; //GetResponse 方法才真的發送請求,等待服務器返回 res = req.GetResponse() as HttpWebResponse; //以流的形式表示的回應內容 Stream str = res.GetResponseStream(); //將字節流包裝為高級的字符流,以便於讀取文本內容 sr = new StreamReader(str, System.Text.Encoding.UTF8); //讀取響應內容 strReturn = sr.ReadToEnd(); } catch (Exception ex) { //記錄異常日志 SZRPP.Common.Utils.WriteLogFile("請求重定向異常:" + ex.Message + " [" + strHeadUrl + strQueryUrl + "?" + strParm + "]", "異常日志"); } finally { //關閉字符流,字符流底層的字節流將會自動關閉 if (sr != null) sr.Close(); if (res != null) res.Close(); } } Response.ClearContent(); //輸出響應內容 Response.Write(Input.LostHTML(Input.URLDecode(strReturn))); //TimeSpan tsTotal = DateTime.Now - dtStart; //SZRPP.Common.Utils.WriteLogFile("請求內容:" + strParm + "\r\n響應內容:" + strReturn + "\r\n耗時:" + tsTotal.TotalSeconds + "秒 來源:" + SZRPPRequest.GetIP() + "\r\n\r\n", "-" + DateTime.Now.Hour + strT + "響應日志", "接口監控詳情"); } Response.End(); } /// <summary> /// 獲取所有參數重新拼接 /// </summary> private string GetAllParameter() { StringBuilder sb = new StringBuilder(); foreach (string strKey in Request.Params.AllKeys) { if (SZRPPRequest.GetString(strKey) != "") { if (sb.Length > 0) sb.Append("&"); sb.Append(strKey + "=" + SZRPPRequest.GetString(strKey)); } } return sb.ToString(); }
2、SZRPPRequest類方法(SZRPP.Common.SZRPPRequest.GetString("t"))
/// <summary> /// 獲得Url或表單參數的值, 先判斷Url參數是否為空字符串, 如為True則返回表單參數的值 /// </summary> /// <param name="strName">參數</param> /// <returns>Url或表單參數的值</returns> public static string GetString(string strName) { if ("".Equals(GetQueryString(strName))) { strName =GetFormString(strName); return strName; } else { strName = GetQueryString(strName); return strName; } } /// <summary> /// 獲得指定Url參數的值 /// </summary> /// <param name="strName">Url參數</param> /// <returns>Url參數的值</returns> public static string GetQueryString(string strName) { if (HttpContext.Current.Request.QueryString[strName] == null) { return ""; } return HttpContext.Current.Request.QueryString[strName]; } /// <summary> /// 獲得指定Url參數的值 /// </summary> /// <param name="strName">Url參數</param> /// <returns>Url參數的值</returns> public static string GetQueryString(string strName) { if (HttpContext.Current.Request.QueryString[strName] == null) { return ""; } return HttpContext.Current.Request.QueryString[strName]; }
3、API目錄及發布在IIS上后的訪問格式:
通過瀏覽器訪問的格式:http://10.10.40.184:6066/Index.aspx?appkey=123456&security=4564646545455&t=Berth&method=getberth
其中【Berth】為【berthAPI】目錄,【getberth】為【berthAPI】目錄下index.aspx.cs下的【getberth】方法
4、API返回內容頁面代碼的編寫(如【berthAPI】目錄下的【index.aspx.cs】代碼:
protected void Page_Load(object sender, EventArgs e) { APIHelper.CheckRequestSecurity(); Response.Expires = 0; Response.CacheControl = "no-cache"; Response.ClearContent(); if (!IsPostBack) { string strMethod = SZRPPRequest.GetString("method").ToString("filtersql").ToLower(); try { switch (strMethod) { //2.1 獲取深圳市行政區列表 case "getcanton": GetSZCanton(); break; //2.2 獲取某行政區下片區列表 case "getarea": GetAreaByCa(); break; //2.3 獲取某片區下路段列表 case "getsection": GetSectionByAr(); break; //2.4 獲取某路段下泊位列表 case "getberthbyse": GetBerthBySE(); break; //2.5 獲取附近泊位列表(多少米以內) case "getbearbyberth": GetBearByBerth(); break; //2.6 獲取行政區下路段列表 case "getsectionbyca": GetSectionByCA(); break; //2.7 獲取路段的收費規則 case "getchargingrules": GetChargingRules(); break; case "getberth": GetBerthInfo(); break; default: break; } } catch (System.Threading.ThreadAbortException) { } catch (Exception ex) { //記錄異常日志 SZRPP.Common.Utils.WriteLogFile("BerthAPI發生異常【" + ex.TargetSite.Name + "】:" + ex.Message + " " + ex.StackTrace, "異常日志"); } } Response.End(); } #region 獲取深圳市行政區列表 /// <summary> /// 獲取深圳市行政區列表 /// </summary> private void GetSZCanton() { StringBuilder sb = new StringBuilder(); CantonBll cantonBll = new CantonBll(); DataTable dt = null; if (DataCache.GetCache("APICanton") == null) { dt = cantonBll.GetList(); DataCache.SetCache("APICanton", dt); } else { dt = (DataTable)DataCache.GetCache("APICanton"); } if (dt != null && dt.Rows.Count > 0) { sb.Append("{\"count\":" + dt.Rows.Count + ","); sb.Append("\"items\":"); sb.Append("["); foreach (DataRow dr in dt.Rows) { sb.Append("{"); sb.Append("\"CantonId\":\"" + dr["CantonId"].ToString() + "\","); sb.Append("\"CantonCode\":\"" + dr["CantonCode"].ToString() + "\","); sb.Append("\"CantonName\":\"" + dr["CantonName"].ToString() + "\","); sb.Append("\"CantonLat\":\"" + dr["CantonLat"].ToString() + "\","); sb.Append("\"CantonLng\":\"" + dr["CantonLng"].ToString() + "\","); sb.Append("\"BerthNums\":\"" + dr["BerthNums"].ToString() + "\""); sb.Append("},"); } sb.Remove(sb.Length - 1, 1); sb.Append("]}"); APIHelper.ReturnData(APIHelper.ReturnStatus.成功, "success", "成功", sb.ToString()); } else { APIHelper.ReturnData(APIHelper.ReturnStatus.失敗, "no_data", "沒有行政區", ""); } } #endregion #region 單泊位查詢 /// <summary> /// 單泊位信息查詢 /// </summary> private void GetBerthInfo() { //泊位編號 string strBerthCode = SZRPPRequest.GetString("berthcode").ToString("filtersql"); BerthBll berthBll = new BerthBll(); DataTable dtBerth = berthBll.GetBerthInfo(strBerthCode); if (dtBerth != null && dtBerth.Rows.Count > 0) { DataRow dr = dtBerth.Rows[0]; StringBuilder sb = new StringBuilder(); //泊位編號 sb.Append("{\"berthcode\":\"" + dr["BerthCode"].ToString() + "\""); //片區 sb.Append(",\"areaid\":\"" + dr["AreaId"].ToString() + "\""); //行政區 sb.Append(",\"cantonid\":\"" + dr["CantonId"].ToString() + "\""); //泊位狀態 sb.Append(",\"berthstatus\":\"" + dr["BerthStatus"].ToString() + "\""); //經度 sb.Append(",\"berthlongitude\":\"" + dr["BerthLongitude"].ToString() + "\""); //緯度 sb.Append(",\"berthlatitude\":\"" + dr["BerthLatitude"].ToString() + "\""); //停車狀態 sb.Append(",\"parkstatus\":\"" + dr["ParkStatus"].ToString() + "\"}"); APIHelper.ReturnData(APIHelper.ReturnStatus.成功, "success", "成功", sb.ToString()); } else APIHelper.ReturnData(APIHelper.ReturnStatus.失敗, "berth_not_exist", "抱歉,您輸入的泊位號不存在", ""); } #endregion #region 獲取所有的行政區和片區 private void GetCantonAndArea() { StringBuilder sb = new StringBuilder(); #region 獲取行政區 DataTable dtCanton = null; if (DataCache.GetCache("APICanton") == null) { CantonBll cantonBll = new CantonBll(); dtCanton = cantonBll.GetList(); DataCache.SetCache("APICanton", dtCanton); } else { dtCanton = (DataTable)DataCache.GetCache("APICanton"); } #endregion #region 獲取片區 DataTable dtArea = null; if (DataCache.GetCache("APIArea") == null) { AreaBll areaBll = new AreaBll(); dtArea = areaBll.GetAreaList(); DataCache.SetCache("APIArea", dtArea); } else { dtArea = (DataTable)DataCache.GetCache("APIArea"); } #endregion if (dtCanton != null && dtCanton.Rows.Count > 0) { if (dtArea != null && dtArea.Rows.Count > 0) { sb.Append("{\"cantons\":"); sb.Append("["); foreach (DataRow dr in dtCanton.Rows) { sb.Append("{"); sb.Append("\"CantonId\":\"" + dr["CantonId"].ToString() + "\","); sb.Append("\"CantonName\":\"" + dr["CantonName"].ToString() + "\""); sb.Append("},"); } sb.Remove(sb.Length - 1, 1); sb.Append("],"); sb.Append("\"areas\":"); sb.Append("["); foreach (DataRow dr in dtArea.Rows) { sb.Append("{"); sb.Append("\"AreaId\":\"" + dr["AreaId"].ToString() + "\","); sb.Append("\"CantonId\":\"" + dr["CantonId"].ToString() + "\","); sb.Append("\"AreaName\":\"" + dr["AreaName"].ToString() + "\""); sb.Append("},"); } sb.Remove(sb.Length - 1, 1); sb.Append("]}"); APIHelper.ReturnData(APIHelper.ReturnStatus.成功, "success", "成功", sb.ToString()); } else { APIHelper.ReturnData(APIHelper.ReturnStatus.失敗, "no_Area", "沒有片區數據", ""); } } else { APIHelper.ReturnData(APIHelper.ReturnStatus.失敗, "no_Canton", "沒有行政區數據", ""); } } #endregion
二、接口的請求
private readonly string url = ConfigurationManager.AppSettings["API"];
private readonly string versontype = ConfigurationManager.AppSettings["versontype"];
private readonly string appkey = ConfigurationManager.AppSettings["appkey"];
private readonly string security = ConfigurationManager.AppSettings["security"];
public ActionResult Login() { string login = SZRTCRequest.GetString("login").ToString("filtersql"); string up = SZRTCRequest.GetString("up").ToString("filtersql"); string lastUrl = SZRTCRequest.GetString("u"); string safeCode = SZRTCRequest.GetString("safeCode").ToString("filtersql"); Session["Login"] = null; ViewBag.LastUrl = lastUrl.ToString();//記錄session失效前最后一次訪問路徑 if (!Request.IsAjaxRequest()) { return View(); } Dictionary<string, object> dic=null; string strJson = ""; try { StringBuilder sb = new StringBuilder(); sb.Append(url); sb.Append("MemberAPI/Index.aspx?versontype=" + versontype); sb.Append("&appkey="+appkey); sb.Append("&security=" + oldsecurity); sb.Append("&t=Member&method=login&mobileno=" + login + "&pwd=" + MD5_SHA.EncryptPassword(up)); sb.Append("&sign="+sign); strJson = CommonLogic.GetJsonStr(sb.ToString()); var jss = new JavaScriptSerializer(); dic = (Dictionary<string, object>)jss.DeserializeObject(strJson); } catch (Exception ex) { Utils.WriteLogFile("調用Login方法時報錯,錯誤信息:" + ex.Message, "登錄異常"); } if (dic != null) { int status = int.Parse(dic["status"].ToString()); string msg = dic["msg"].ToString(); if (status == 1) { object data = dic["data"]; Session["Login"] = data; } return Content(strJson); } else { return Content("-1"); } } /// <summary> /// 根據路徑返回json字符 /// </summary> /// <param name="url">調用接口路徑</param> /// <returns>返回json字符</returns> public static string GetJsonStr(string url) { string message = ""; string strJson = ""; try { HttpWebRequest req = null; HttpWebResponse webResp = null; req = (HttpWebRequest)WebRequest.Create(url); req.Method = "POST"; // Post method req.ContentType = "text/html"; // content type StreamWriter writer = new StreamWriter(req.GetRequestStream()); writer.WriteLine(message); writer.Close(); webResp = (HttpWebResponse)req.GetResponse(); Stream answer = webResp.GetResponseStream(); StreamReader answerData = new StreamReader(answer, Encoding.UTF8); strJson = answerData.ReadToEnd(); } catch (Exception ex) { Utils.WriteLogFile("接口調用出現異常,異常信息:"+ex.Message,"接口調用異常"); } return strJson; }