工作中,很多地方,都存在只知道手机号,同时也想知道这个手机号的归属地的情况。
本功能,即可实现这个要求。同时,可在此基础上做调整,实现其它功能,如制作一个属于自己的手机号段归属库等。。。
实现思路:通过网上提供的免费查询接口,取得返回信息,并对返回信息进行解析处理,获取自己需要的数据。
使用控件:LitJson.dll (LitJson.dll下载 或到网上搜索)
代码如下:
class="brush:csharp;gutter:true;"> /// <summary> /// 获取url的返回值 /// </summary> /// <param name="url">eg:http://m.weather.com.cn/atad/101010100.html </param> private string RequestGetInfo(string url) { string strBuff = ""; Uri httpURL = new Uri(url); // HttpWebRequest类继承于WebRequest,并没有自己的构造函数,需通过WebRequest的Creat方法 建立,并进行强制的类型转换 HttpWebRequest httpReq = (HttpWebRequest)WebRequest.Create(httpURL); // 通过HttpWebRequest的GetResponse()方法建立HttpWebResponse,强制类型转换 HttpWebResponse httpResp = (HttpWebResponse)httpReq.GetResponse(); // GetResponseStream()方法获取HTTP响应的数据流,并尝试取得URL中所指定的网页内容 // 若成功取得网页的内容,则以System.IO.Stream形式返回,若失败则产生ProtoclViolationException错 误。在此正确的做法应将以下的代码放到一个try块中处理。这里简单处理 Stream respStream = httpResp.GetResponseStream(); // 返回的内容是Stream形式的,所以可以利用StreamReader类获取GetResponseStream的内容,并以 // StreamReader类的Read方法依次读取网页源程序代码每一行的内容,直至行尾(读取的编码格式:UTF8) StreamReader respStreamReader = new StreamReader(respStream, Encoding.UTF8); strBuff = respStreamReader.ReadToEnd(); return strBuff; }
调用代码:
string txtPhone = this.txtMobile.Text; // 输入的手机号码 string url = "http://v.showji.com/Locating/showji.com2016234999234.aspx?output=json&callback=querycallback×tamp=" + GetNowTimestamp() + "&m=" + txtPhone; string get = RequestGetInfo(url); get = get.Substring(get.IndexOf('{')); get = get.Substring(0, get.IndexOf('}') + 1); JsonData jd = JsonMapper.ToObject(get); string result = jd["QueryResult"].ToString(); string city = jd["City"].ToString(); // 归属城市 MessageBox.Show(get);
其中:GetNowTimestamp()取的时间戳,以保证值不同。
private string GetNowTimestamp() { TimeSpan span = DateTime.Now - new DateTime(1970, 1, 1, 0, 0, 0, 0).ToLocalTime(); return span.TotalSeconds.ToString(); }
如输入手机号:13800138000(实际上只需要手机号的前7位即可),get值返回字符串: "{"Mobile":"13800138000","QueryResult":"True","TO":"中国移动","Corp":"中国移动","Province":"北京","City":"北京","AreaCode":"010","PostCode":"100000","VNO":"","Card":""}。
Mobile为手机号(段)
QueryResult为查询结果,=True表示查询成功。=False为查询失败。
Corp为号码所属公司
Province为所属省份
City为所属城市
AreadCode为所在地的电话区号
PostCode为所在地邮编
其它信息未知。
顺带说一下使用LitJson使用过程中的问题,就是它将JSON对象转换成字符串时,会将中文自动转成Unicode编码,保存到文件上时,看起不够直观。所以,提供一个Unicode与正常字符串之间的转码处理函数:
/// <summary> /// <summary> /// 字符串转Unicode /// </summary> /// <param name="source">源字符串</param> /// <returns>Unicode编码后的字符串</returns> public static string String2Unicode(string source) { byte[] bytes = Encoding.Unicode.GetBytes(source); StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < bytes.Length; i += 2) { stringBuilder.AppendFormat("\\u{0}{1}", bytes[i + 1].ToString("x").PadLeft(2, '0'), bytes[i].ToString("x").PadLeft(2, '0')); } return stringBuilder.ToString(); } /// <summary> /// Unicode转字符串 /// </summary> /// <param name="source">经过Unicode编码的字符串</param> /// <returns>正常字符串</returns> public static string Unicode2String(string source) { return new Regex(@"\\u([0-9A-F]{4})", RegexOptions.IgnoreCase | RegexOptions.Compiled).Replace( source, x => string.Empty + Convert.ToChar(Convert.ToUInt16(x.Result("$1"), 16))); }
调用:
// configFile为文件名 // jdNew为JSON对象 // jdNew.ToJson()将JSON对象转成字符串 File.WriteAllText(configFile, Unicode2String( jdNew.ToJson()));
以上代码,均为网上获取,同时也分享给大家,希望对大家有用。
各位可发挥自己的想象力,在此基础上,做出自己需要的东西了。