httpClient調用方式json
namespace SOA.Common { //httpClient調用WebApi public class HttpClientHelper { public static string GetHttpClient(string serverUrl, string method, WebHeaderCollection header) { using (HttpClient client = new HttpClient()) { //若是有Basic認證的狀況下,請本身封裝header if (header != null) client.DefaultRequestHeaders.Add("Authorization", "BasicAuth " + header["Authorization"]); var response = client.GetAsync(serverUrl + method).Result; //拿到異步結果 Console.WriteLine(response.StatusCode); //確保http成功 return response.Content.ReadAsStringAsync().Result; } } public static string PostHttpClient(string serverUrl, string method, Dictionary<string, string> param) { using (HttpClient client = new HttpClient()) { var content = new FormUrlEncodedContent(param); client.DefaultRequestHeaders.Add("user-agent", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)"); var response = client.PostAsync(serverUrl + method, content).Result; //拿到異步結果 Console.WriteLine(response.StatusCode); //確保http成功 return response.Content.ReadAsStringAsync().Result; } } /// <summary> /// httpClient使用代理 /// </summary> /// <param name="serverUrl"></param> /// <param name="method"></param> /// <param name="param"></param> /// <returns></returns> public static string PostHttpClientWithProxy(string serverUrl, string method, Dictionary<string, string> param, ProxyParam proxyParam) { HttpClientHandler aHandler = new HttpClientHandler(); aHandler.UseCookies = true; aHandler.AllowAutoRedirect = true; IWebProxy Proxya = new WebProxy(proxyParam.IP + ":" + proxyParam.Port); Proxya.Credentials = new NetworkCredential(proxyParam.Name, proxyParam.Pass, proxyParam.Domain); aHandler.Proxy = Proxya; using (HttpClient client = new HttpClient(aHandler)) { var content = new FormUrlEncodedContent(param); client.DefaultRequestHeaders.Add("user-agent", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)"); var response = client.PostAsync(serverUrl + method, content).Result; //拿到異步結果 Console.WriteLine(response.StatusCode); //確保http成功 return response.Content.ReadAsStringAsync().Result; } } } public class ProxyParam { public string IP { get; set; } public string Port { get; set; } public string Name { get; set; } public string Pass { get; set; } public string Domain { get; set; } } }
httpWebReqeust調用方式(通常使用)api
//WebRequest調用WebApi public class WebRequestHelper { /// <summary> /// WebRequest的 Get 請求 /// </summary> /// <param name="serverUrl" type="string"> /// <para> /// api地址(地址+方法) /// </para> /// </param> /// <param name="paramData" type="string"> /// <para> /// 參數 /// </para> /// </param> public static string GetWebRequest(string serverUrl, string paramData, WebHeaderCollection header) { string requestUrl = serverUrl; if (serverUrl.IndexOf('?') == -1 && paramData.IndexOf('?') == -1) requestUrl += "?"; requestUrl += paramData; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(requestUrl); if (header != null) request.Headers = header; request.ContentType = "application/json"; request.Timeout = 30 * 1000; request.Method = "GET"; string result = string.Empty; using (var res = request.GetResponse() as HttpWebResponse) { if (res.StatusCode == HttpStatusCode.OK) { var reader = new StreamReader(res.GetResponseStream(), Encoding.UTF8); result = reader.ReadToEnd(); } return result; } } /// <summary> /// WebRequest的 Post 請求 /// </summary> /// <param name="serverUrl" type="string"> /// <para> /// api地址(地址+方法) /// </para> /// </param> /// <param name="postData" type="string"> /// <para> /// 參數 /// </para> /// </param> public static string PostWebRequest(string serverUrl, string postData, WebHeaderCollection header) { var dataArray = Encoding.UTF8.GetBytes(postData); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(serverUrl); if (header != null) request.Headers = header; request.ContentLength = dataArray.Length; //設置上傳服務的數據格式 request.ContentType = "application/json"; request.Timeout = 30 * 1000; request.Method = "POST"; //建立輸入流 Stream dataStream; try { dataStream = request.GetRequestStream(); } catch (Exception) { return null;//鏈接服務器失敗 } //發送請求 dataStream.Write(dataArray, 0, dataArray.Length); dataStream.Close(); //讀取返回值 string result = string.Empty; using (var res = request.GetResponse() as HttpWebResponse) { if (res.StatusCode == HttpStatusCode.OK) { var reader = new StreamReader(res.GetResponseStream(), Encoding.UTF8); result = reader.ReadToEnd(); } return result; } } }
封裝的調用數組
namespace SOA.Common { public class ApiHelper { public static readonly ApiHelper Instance = new ApiHelper(); public string RequestApi(string method, string queryString, WebHeaderCollection header = null) { string result = WebRequestHelper.GetWebRequest(ConfigHelper.Config.ApiUrl + method, queryString, header); return result; } public AjaxResult RequestApi<T>(string method, string queryString, WebHeaderCollection header = null) { var result = WebRequestHelper.GetWebRequest(ConfigHelper.Config.ApiUrl + method, queryString, header); return SerializeResult<T>(result); } /// <summary> /// 序列化結果 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="result"></param> /// <returns></returns> private AjaxResult SerializeResult<T>(string result) { AjaxResult resultModel = JsonConverter.FromJsonTo<AjaxResult>(result); if (resultModel.Status == 0 && resultModel.Data != null && !string.IsNullOrEmpty(resultModel.Data.ToString())) { if (resultModel.Data.ToString().IndexOf("[") == 0 && StringHelper.IsJson(resultModel.Data.ToString())) { resultModel.Data = JsonConverter.FromJsonTo<List<T>>(resultModel.Data.ToString()); } else if (StringHelper.IsJson(resultModel.Data.ToString())) { resultModel.Data = JsonConverter.FromJsonTo<T>(resultModel.Data.ToString()); } } return resultModel; } } }
StringHelper.cs 幫助類服務器
namespace SOA.Common { public class StringHelper { public static string AreaAttr(string defaultStr, int max = 0, string tipTitle = "", string tipid = "") { string text = ""; if (!string.IsNullOrWhiteSpace(defaultStr)) { text = text + " tipmsg=\"" + defaultStr + "\" onfocus=\"utils.ContentKeyFocus(this)\" onblur=\"utils.ContentKeyBlur(this)\""; text += " style=\"color:#999;\""; } if (max > 0) { string text2 = text; text = string.Concat(new string[] { text2, " onkeyup=\"utils.ContentKeyUpDown2(this,", max.ToString(), ",'", tipid, "',0,'", tipTitle, "')\"" }); } return text; } public static string InputAttr(string val, string defaultStr, int max = 0, string tipTitle = "", string tipid = "") { string text = ""; if (!string.IsNullOrWhiteSpace(val)) { text = text + " value=\"" + val + "\""; } if (!string.IsNullOrWhiteSpace(defaultStr)) { if (string.IsNullOrWhiteSpace(val)) { text = text + " value=\"" + defaultStr + "\""; } text = text + " tipmsg=\"" + defaultStr + "\" onfocus=\"utils.ContentKeyFocus(this)\" onblur=\"utils.ContentKeyBlur(this)\""; text += " style=\"color:#999;\""; } if (max > 0) { string text2 = text; text = string.Concat(new string[] { text2, " onkeyup=\"utils.ContentKeyUpDown2(this,", max.ToString(), ",'", tipid, "',0,'", tipTitle, "')\"" }); } return text; } public static string WapEncode(string source) { return (!string.IsNullOrEmpty(source)) ? source.Replace("&", "&").Replace("<", "<").Replace(">", ">").Replace("‘", "'").Replace("\"", """).Replace("$", "$").Replace(" ", " ") : ""; } public static string SubStr(string srcStr, int len) { string result; if (len < 1) { result = string.Empty; } else { if (string.IsNullOrEmpty(srcStr)) { result = srcStr; } else { int byteCount = System.Text.Encoding.Default.GetByteCount(srcStr); if (byteCount <= len) { result = srcStr; } else { int num = 0; int num2 = 0; char[] array = srcStr.ToCharArray(); char[] array2 = array; for (int i = 0; i < array2.Length; i++) { char c = array2[i]; int byteCount2 = System.Text.Encoding.Default.GetByteCount(array, num2, 1); int num3 = num + byteCount2; if (num3 > len) { result = srcStr.Substring(0, num2) + "..."; return result; } num = num3; num2++; } result = srcStr; } } } return result; } public static string ReplaceIDS(string oldIds, bool isNoZero = true) { string result; if (string.IsNullOrWhiteSpace(oldIds)) { result = ""; } else { string[] array = oldIds.Trim().Trim(new char[] { ',' }).Split(new char[] { ',' }); System.Collections.Generic.List<long> list = new System.Collections.Generic.List<long>(); string[] array2 = array; for (int i = 0; i < array2.Length; i++) { string text = array2[i]; long num = TypeHelper.StrToInt64(text.Trim(), 0L); if (!isNoZero || num != 0L) { if (!list.Contains(num)) { list.Add(num); } } } string text2 = ""; foreach (long current in list) { text2 = text2 + "," + current.ToString(); } result = text2.Trim(new char[] { ',' }); } return result; } public static string ReplaceStr2(string sourceStr) { string result; if (string.IsNullOrWhiteSpace(sourceStr)) { result = sourceStr; } else { result = sourceStr.Trim().Replace(" ", "").Replace("'", "").Replace("\"", ""); } return result; } public static string Cut(string str, int len, System.Text.Encoding encoding) { string result; if (string.IsNullOrEmpty(str)) { result = str; } else { if (len <= 0) { result = string.Empty; } else { int byteCount = encoding.GetByteCount(str); if (byteCount > len) { bool flag = byteCount == str.Length; if (flag) { result = str.Substring(0, len); return result; } int num = 0; int num2 = 0; char[] array = str.ToCharArray(); char[] array2 = array; for (int i = 0; i < array2.Length; i++) { char c = array2[i]; int byteCount2 = encoding.GetByteCount(array, num2, 1); int num3 = num + byteCount2; if (num3 > len) { result = str.Substring(0, num2); return result; } num = num3; num2++; } } result = str; } } return result; } public static int GetChineseLength(string s) { int result; if (string.IsNullOrEmpty(s)) { result = 0; } else { result = System.Text.Encoding.GetEncoding("gb2312").GetByteCount(s); } return result; } public static int GetUTF8Length(string s) { int result; if (string.IsNullOrEmpty(s)) { result = 0; } else { result = System.Text.Encoding.UTF8.GetByteCount(s); } return result; } public static string StrFormat(string str) { string result; if (str == null) { result = ""; } else { str = str.Replace("\r\n", "<br />"); str = str.Replace("\n", "<br />"); result = str; } return result; } public static string EncodeHtml(string strHtml) { string result; if (strHtml != "") { strHtml = strHtml.Replace(",", "&def"); strHtml = strHtml.Replace("'", "&dot"); strHtml = strHtml.Replace(";", "&dec"); result = strHtml; } else { result = ""; } return result; } public static string HtmlDecode(string str) { return HttpUtility.HtmlDecode(str); } public static string HtmlEncode(string str) { return HttpUtility.HtmlEncode(str); } public static string UrlEncode(string str) { return HttpUtility.UrlEncode(str); } public static string UrlDecode(string str) { return HttpUtility.UrlDecode(str); } public static bool StrIsNullOrEmpty(string str) { return str == null || str.Trim() == string.Empty; } public static string CutString(string str, int startIndex, int length) { string result; if (string.IsNullOrWhiteSpace(str)) { result = ""; } else { if (startIndex >= 0) { if (length < 0) { length *= -1; if (startIndex - length < 0) { length = startIndex; startIndex = 0; } else { startIndex -= length; } } if (startIndex > str.Length) { result = ""; return result; } } else { if (length < 0) { result = ""; return result; } if (length + startIndex <= 0) { result = ""; return result; } length += startIndex; startIndex = 0; } if (str.Length - startIndex < length) { length = str.Length - startIndex; } result = str.Substring(startIndex, length); } return result; } public static string CutString(string str, int startIndex) { string result; if (string.IsNullOrWhiteSpace(str)) { result = ""; } else { result = StringHelper.CutString(str, startIndex, str.Length); } return result; } public static string ToSqlInStr(System.Collections.Generic.List<int> ids) { string text = ""; if (ids != null && ids.Count > 0) { foreach (int current in ids) { text = text + current + ","; } } text = text.Trim(",".ToCharArray()); return text; } public static string ToSqlInStr(System.Collections.Generic.List<long> ids) { string text = ""; if (ids != null && ids.Count > 0) { foreach (long current in ids) { text = text + current + ","; } } text = text.Trim(",".ToCharArray()); return text; } public static string ToSqlInStr(System.Collections.Generic.List<string> ids) { string text = ""; if (ids != null && ids.Count > 0) { foreach (string current in ids) { text = text + "'" + current + "',"; } } text = text.Trim(",".ToCharArray()); return text; } public static string FilteSQLStr(string Str) { string result; if (string.IsNullOrEmpty(Str)) { result = ""; } else { Str = Str.Replace("'", ""); Str = Str.Replace("\"", ""); Str = Str.Replace("&", "&"); Str = Str.Replace("<", "<"); Str = Str.Replace(">", ">"); Str = Str.Replace("delete", ""); Str = Str.Replace("update", ""); Str = Str.Replace("insert", ""); result = Str; } return result; } private static bool IsJsonStart(ref string json) { if (!string.IsNullOrEmpty(json)) { json = json.Trim('\r', '\n', ' '); if (json.Length > 1) { char s = json[0]; char e = json[json.Length - 1]; return (s == '{' && e == '}') || (s == '[' && e == ']'); } } return false; } internal static bool IsJson(string json) { int errIndex; return IsJson(json, out errIndex); } internal static bool IsJson(string json, out int errIndex) { errIndex = 0; if (IsJsonStart(ref json)) { CharState cs = new CharState(); char c; for (int i = 0; i < json.Length; i++) { c = json[i]; if (SetCharState(c, ref cs) && cs.childrenStart)//設置關鍵符號狀態。 { string item = json.Substring(i); int err; int length = GetValueLength(item, true, out err); cs.childrenStart = false; if (err > 0) { errIndex = i + err; return false; } i = i + length - 1; } if (cs.isError) { errIndex = i; return false; } } return !cs.arrayStart && !cs.jsonStart; } return false; } /// <summary> /// 獲取值的長度(當Json值嵌套以"{"或"["開頭時) /// </summary> private static int GetValueLength(string json, bool breakOnErr, out int errIndex) { errIndex = 0; int len = 0; if (!string.IsNullOrEmpty(json)) { CharState cs = new CharState(); char c; for (int i = 0; i < json.Length; i++) { c = json[i]; if (!SetCharState(c, ref cs))//設置關鍵符號狀態。 { if (!cs.jsonStart && !cs.arrayStart)//json結束,又不是數組,則退出。 { break; } } else if (cs.childrenStart)//正常字符,值狀態下。 { int length = GetValueLength(json.Substring(i), breakOnErr, out errIndex);//遞歸子值,返回一個長度。。。 cs.childrenStart = false; cs.valueStart = 0; //cs.state = 0; i = i + length - 1; } if (breakOnErr && cs.isError) { errIndex = i; return i; } if (!cs.jsonStart && !cs.arrayStart)//記錄當前結束位置。 { len = i + 1;//長度比索引+1 break; } } } return len; } /// <summary> /// 字符狀態 /// </summary> private class CharState { internal bool jsonStart = false;//以 "{"開始了... internal bool setDicValue = false;// 能夠設置字典值了。 internal bool escapeChar = false;//以"\"轉義符號開始了 /// <summary> /// 數組開始【僅第一開頭纔算】,值嵌套的以【childrenStart】來標識。 /// </summary> internal bool arrayStart = false;//以"[" 符號開始了 internal bool childrenStart = false;//子級嵌套開始了。 /// <summary> /// 【0 初始狀態,或 遇到「,」逗號】;【1 遇到「:」冒號】 /// </summary> internal int state = 0; /// <summary> /// 【-1 取值結束】【0 未開始】【1 無引號開始】【2 單引號開始】【3 雙引號開始】 /// </summary> internal int keyStart = 0; /// <summary> /// 【-1 取值結束】【0 未開始】【1 無引號開始】【2 單引號開始】【3 雙引號開始】 /// </summary> internal int valueStart = 0; internal bool isError = false;//是否語法錯誤。 internal void CheckIsError(char c)//只當成一級處理(由於GetLength會遞歸到每個子項處理) { if (keyStart > 1 || valueStart > 1) { return; } //示例 ["aa",{"bbbb":123,"fff","ddd"}] switch (c) { case '{'://[{ "[{A}]":[{"[{B}]":3,"m":"C"}]}] isError = jsonStart && state == 0;//重複開始錯誤 同時不是值處理。 break; case '}': isError = !jsonStart || (keyStart != 0 && state == 0);//重複結束錯誤 或者 提早結束{"aa"}。正常的有{} break; case '[': isError = arrayStart && state == 0;//重複開始錯誤 break; case ']': isError = !arrayStart || jsonStart;//重複開始錯誤 或者 Json 未結束 break; case '"': case '\'': isError = !(jsonStart || arrayStart); //json 或數組開始。 if (!isError) { //重複開始 [""",{"" "}] isError = (state == 0 && keyStart == -1) || (state == 1 && valueStart == -1); } if (!isError && arrayStart && !jsonStart && c == '\'')//['aa',{}] { isError = true; } break; case ':': isError = !jsonStart || state == 1;//重複出現。 break; case ',': isError = !(jsonStart || arrayStart); //json 或數組開始。 if (!isError) { if (jsonStart) { isError = state == 0 || (state == 1 && valueStart > 1);//重複出現。 } else if (arrayStart)//["aa,] [,] [{},{}] { isError = keyStart == 0 && !setDicValue; } } break; case ' ': case '\r': case '\n'://[ "a",\r\n{} ] case '\0': case '\t': break; default: //值開頭。。 isError = (!jsonStart && !arrayStart) || (state == 0 && keyStart == -1) || (valueStart == -1 && state == 1);// break; } //if (isError) //{ //} } } /// <summary> /// 設置字符狀態(返回true則爲關鍵詞,返回false則當爲普通字符處理) /// </summary> private static bool SetCharState(char c, ref CharState cs) { cs.CheckIsError(c); switch (c) { case '{'://[{ "[{A}]":[{"[{B}]":3,"m":"C"}]}] #region 大括號 if (cs.keyStart <= 0 && cs.valueStart <= 0) { cs.keyStart = 0; cs.valueStart = 0; if (cs.jsonStart && cs.state == 1) { cs.childrenStart = true; } else { cs.state = 0; } cs.jsonStart = true;//開始。 return true; } #endregion break; case '}': #region 大括號結束 if (cs.keyStart <= 0 && cs.valueStart < 2 && cs.jsonStart) { cs.jsonStart = false;//正常結束。 cs.state = 0; cs.keyStart = 0; cs.valueStart = 0; cs.setDicValue = true; return true; } // cs.isError = !cs.jsonStart && cs.state == 0; #endregion break; case '[': #region 中括號開始 if (!cs.jsonStart) { cs.arrayStart = true; return true; } else if (cs.jsonStart && cs.state == 1) { cs.childrenStart = true; return true; } #endregion break; case ']': #region 中括號結束 if (cs.arrayStart && !cs.jsonStart && cs.keyStart <= 2 && cs.valueStart <= 0)//[{},333]//這樣結束。 { cs.keyStart = 0; cs.valueStart = 0; cs.arrayStart = false; return true; } #endregion break; case '"': case '\'': #region 引號 if (cs.jsonStart || cs.arrayStart) { if (cs.state == 0)//key階段,有多是數組["aa",{}] { if (cs.keyStart <= 0) { cs.keyStart = (c == '"' ? 3 : 2); return true; } else if ((cs.keyStart == 2 && c == '\'') || (cs.keyStart == 3 && c == '"')) { if (!cs.escapeChar) { cs.keyStart = -1; return true; } else { cs.escapeChar = false; } } } else if (cs.state == 1 && cs.jsonStart)//值階段必須是Json開始了。 { if (cs.valueStart <= 0) { cs.valueStart = (c == '"' ? 3 : 2); return true; } else if ((cs.valueStart == 2 && c == '\'') || (cs.valueStart == 3 && c == '"')) { if (!cs.escapeChar) { cs.valueStart = -1; return true; } else { cs.escapeChar = false; } } } } #endregion break; case ':': #region 冒號 if (cs.jsonStart && cs.keyStart < 2 && cs.valueStart < 2 && cs.state == 0) { if (cs.keyStart == 1) { cs.keyStart = -1; } cs.state = 1; return true; } // cs.isError = !cs.jsonStart || (cs.keyStart < 2 && cs.valueStart < 2 && cs.state == 1); #endregion break; case ',': #region 逗號 //["aa",{aa:12,}] if (cs.jsonStart) { if (cs.keyStart < 2 && cs.valueStart < 2 && cs.state == 1) { cs.state = 0; cs.keyStart = 0; cs.valueStart = 0; //if (cs.valueStart == 1) //{ // cs.valueStart = 0; //} cs.setDicValue = true; return true; } } else if (cs.arrayStart && cs.keyStart <= 2) { cs.keyStart = 0; //if (cs.keyStart == 1) //{ // cs.keyStart = -1; //} return true; } #endregion break; case ' ': case '\r': case '\n'://[ "a",\r\n{} ] case '\0': case '\t': if (cs.keyStart <= 0 && cs.valueStart <= 0) //cs.jsonStart && { return true;//跳過空格。 } break; default: //值開頭。。 if (c == '\\') //轉義符號 { if (cs.escapeChar) { cs.escapeChar = false; } else { cs.escapeChar = true; return true; } } else { cs.escapeChar = false; } if (cs.jsonStart || cs.arrayStart) // Json 或數組開始了。 { if (cs.keyStart <= 0 && cs.state == 0) { cs.keyStart = 1;//無引號的 } else if (cs.valueStart <= 0 && cs.state == 1 && cs.jsonStart)//只有Json開始纔有值。 { cs.valueStart = 1;//無引號的 } } break; } return false; } } }