通過HttpWebRequest請求與HttpWebResponse響應方式發布接口與訪問接口


一、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; }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM