using Fa_Xiaomi_N801A.MainForm.EDEHelper; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Net.Http; using System.Text; using System.Threading.Tasks; namespace MainForm.ClassFile.XiaomiAPI_MES { /// /// 小米MES - X5协议接⼝ /// public class XiaomiMESHttp_X5 { #region 变量 /// /// 系统分配的应⽤ID;mes_test /// protected static string Appid { set; get; } = GlobalContext.MESAppId; /// /// Appkey;mes /// protected static string Appkey { set; get; } = GlobalContext.MESAppKey; /// /// 接口地址 /// protected static string MESUrl { set; get; } = string.Empty; /// /// 接口方法 /// protected static string Method { set; get; } = string.Empty; #endregion 变量 #region 其他方法 /// /// 计算md5签名 /// 1、计算md5 /// 2、转大写字母 /// /// 应⽤ID /// 报文内容;json字符串 /// 应用密钥 /// 大写的md5签名 public static string GetSign_Up(string appid, string bodyJson, string appkey) { string sign = appid + bodyJson + appkey; // 计算大写的md5 string md5Up = Md5Helper.GetMD5Value_String(sign, false, true); return md5Up; } /// /// BASE64序列化 /// /// /// public static string BodyToBASE64(string bodyJson) { byte[] bytes = Encoding.UTF8.GetBytes(bodyJson); string base64Str = Convert.ToBase64String(bytes); return base64Str; } #endregion 其他方法 /// /// Post请求可用 /// /// /// 报文头 /// 报文内容(大概是header+body) /// public static XiaomiMES_X5Response Post(string url, string data, XiaomiMES_X5RequestHeader x5Header = null, XiaomiMES_X5RequestBody x5Body = null) { XiaomiMES_X5Response x5Response = new XiaomiMES_X5Response(); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); Stream myResponseStream = null; StreamReader myStreamReader = null; HttpWebResponse response = null; try { request = (HttpWebRequest)WebRequest.Create(url); request.Method = "POST"; request.Referer = ""; request.Timeout = 8000; // 8s //request.Proxy = new WebProxy("192.168.1.12",80); byte[] bytes = Encoding.UTF8.GetBytes(data); //request.ContentType = "multipart/form-data; charset=UTF-8"; ;//窗体数据被编码为名称/值对形式 //request.Headers.Add("appid", x5Header.AppId); //request.Headers.Add("method", x5Header.Method); //request.Headers.Add("url", x5Header.Url); //request.Headers.Add("sign", x5Header.Sign); //request.Headers.Add("sign_type", "md5"); // md5 //request.Headers.Add("userName", x5Body.UserName); request.ContentType = "application/json;charset=utf-8"; request.ContentLength = bytes.Length; myResponseStream = request.GetRequestStream(); myResponseStream.Write(bytes, 0, bytes.Length); string retString; response = (HttpWebResponse)request.GetResponse(); myStreamReader = new StreamReader(response.GetResponseStream(), Encoding.UTF8); retString = myStreamReader.ReadToEnd(); //解析结果 JObject joRoot; joRoot = (JObject)JsonConvert.DeserializeObject(retString); x5Response = new XiaomiMES_X5Response(); string headerJson = joRoot["header"].ToString(); x5Response.header = JsonConvert.DeserializeObject(headerJson); x5Response.body = joRoot["body"].ToString(); } catch (Exception ex) { x5Response = new XiaomiMES_X5Response { header = new XiaomiMES_X5ResponseHeader() { code = string.Empty, desc = ex.Message.ToString(), }, body = string.Empty }; } finally { response?.Close(); request?.Abort(); myStreamReader?.Close(); myResponseStream?.Close(); } return x5Response; } public static string DoX5Post(string url, string data) { using (var client = new HttpClient()) { var content = new StringContent($"data={Uri.EscapeDataString(data)}", Encoding.UTF8, "application/x-www-form-urlencoded"); var response = client.PostAsync(url, content).Result; if (!response.IsSuccessStatusCode && response.StatusCode == System.Net.HttpStatusCode.MethodNotAllowed) { Console.WriteLine("The HTTP method is not allowed for this resource."); } response.EnsureSuccessStatusCode(); var responseBody = response.Content.ReadAsStringAsync().Result; return responseBody; } } ///// ///// Get请求 ///// ///// ///// //public static ResponseData Get(string Url) //{ // ResponseData responseData = new ResponseData(); // HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url); // HttpWebResponse response = null; // Stream myResponseStream = null; // StreamReader myStreamReader = null; // try // { // request.Proxy = null; // request.KeepAlive = false; // request.Method = "GET"; // request.ContentType = "application/json; charset=UTF-8"; // //request.ContentType = "application/x-www-form-urlencoded";//窗体数据被编码为名称/值对形式 // request.AutomaticDecompression = DecompressionMethods.GZip; // response = (HttpWebResponse)request.GetResponse(); // myResponseStream = response.GetResponseStream(); // myStreamReader = new StreamReader(myResponseStream, Encoding.UTF8); // string retString = myStreamReader.ReadToEnd(); // //解析结果 // JObject joRoot; // joRoot = (JObject)JsonConvert.DeserializeObject(retString); // responseData = new ResponseData // { // code = joRoot["code"].ToString(), // msg = joRoot["msg"].ToString(), // data = joRoot["data"].ToString() // }; // } // catch (Exception ex) // { // responseData = new ResponseData // { // code = "", // msg = ex.Message.ToString(), // data = string.Empty // }; // } // finally // { // response?.Close(); // request?.Abort(); // myStreamReader?.Close(); // myResponseStream?.Close(); // } // return responseData; //} } /// /// 小米MES - X5协议接⼝ - 入参 - 报文头 /// public class XiaomiMES_X5RequestHeader { /// /// 系统分配的应⽤ID;mes_test /// 长度50 /// 必填 /// public string appid { get; set; } = string.Empty; /// /// API接⼝名称;mes /// 长度100 /// 非必填 /// public string method { get; set; } = string.Empty; /// /// md5签名 /// 长度50 /// 必填 /// public string sign { get; set; } = string.Empty; /// /// 接⼝地址;http:/域名/restful/x5/mes /// 长度255 /// 非必填 /// public string url { get; set; } = string.Empty; } /// /// 小米MES - X5协议接⼝ - 入参 - 报文内容(Body) /// public class XiaomiMES_X5RequestBody { /// /// 用户名 /// 长度50 /// 必填 /// public string UserName { get; set; } = string.Empty; } /// /// 小米MES - X5协议接⼝ - 出参 /// public class XiaomiMES_X5Response { /// /// 出参 Header /// public XiaomiMES_X5ResponseHeader header { get; set; } = new XiaomiMES_X5ResponseHeader(); /// /// 出参 具体业务数据 /// Json /// public string body { get; set; } = string.Empty; } /// /// 小米MES - X5协议接⼝ - 出参 - 报文头(Header) /// public class XiaomiMES_X5ResponseHeader { /// /// 状态码 /// 200表⽰成功,⾮200表⽰失败 /// public string code { get; set; } = string.Empty; /// /// 状态描述 /// code为⾮200,这⾥表⽰具体的失败原因,如果code为200,这⾥成功的描述,可能是空 /// public string desc { get; set; } = string.Empty; } }