我們先來看看下面的圖片吧
在hao123的這個界面裏我們只要輸入一個手機號不管是移動,聯通,電信的都可以,單擊查詢就可以直接查詢到歸屬地,和號碼類型,網上這樣的
網站很多,我就以這個爲例子吧,那我們怎麼樣把這些信息放到我們自己的網站上呢?
我們先來分析一下,其實很方便,我們在IE9下打開這個界面然後在工具---開發人員工具,或是直接安f12也是一樣的效果,我們安界面定位到如下圖
我們先單擊網絡然後單擊開始捕獲,這個時候我們再單擊一下查詢按鈕看看會出現什麼情況
是不是出現兩個整個,第一個很明顯是加載我們所輸入號歸屬地信息,第一個是加載一個圖片,對我們沒有任何用處,這裏不管它,現在我們
來單擊一下第一個方法看看捕獲到了什麼
URL http://vip.showji.com/locating/?m=13888888888&outfmt=json&callback=phone.callBack 很明顯這是一個GEt請求,只要請求這個地址就能得到下面的結果
phone.callBack({"Mobile":"13888888888","QueryResult":"True","Province":"雲南","City":"昆明","AreaCode":"0871","PostCode":"650000","Corp":"中國移動","Card":"GSM"});
用手機號,省,市,還有郵編,號碼類型等信息。這樣看的話是不是我們直接把這個地區複製到地址欄裏就行了,那咱們一起來看看效果吧
果然沒錯就是我們想要的東西,大家別急,其它還可以更簡單,我們來看一下這個URL
http://vip.showji.com/locating/?m=13888888888&outfmt=json&callback=phone.callBack
如果現在我把這個RUles號碼後面的刪除只保留http://vip.showji.com/locating/?m=13888888888這些會出現什麼情況呢?
直接放到地址欄裏試試效果
呵呵,很神奇吧,居然得到的是一個Xml文件
這就像是我們在調用WebServces一樣簡單了,我們只要寫一個程序請求這個地址就可以得到我們想要的效果了。
隨便新建一個項目,一起來看一下
我就不一步一步的分析了大家直接看我的代碼
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.IO;
using System.Security.Cryptography.X509Certificates;
using System.Net.Security;
using System.Security.Cryptography;
using System.Xml;
namespace ccbText
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void Form2_Load(object sender, EventArgs e)
{
}
這個方法在這裏沒有用到,大家可以做爲參考
/// <summary>
/// 傳入URL返回網頁的html代碼
/// </summary>
/// <param name="Url">URL</param>
/// <returns></returns>
public string GetUrltoHtml(string Url)
{
StringBuilder content = new StringBuilder();
try
{
// 與指定URL創建HTTP請求
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
request.KeepAlive = false;
// 獲取對應HTTP請求的響應
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
// 獲取響應流
Stream responseStream = response.GetResponseStream();
// 對接響應流(以"GBK"字符集)
StreamReader sReader = new StreamReader(responseStream, Encoding.GetEncoding("utf-8"));
// 開始讀取數據
Char[] sReaderBuffer = new Char[256];
int count = sReader.Read(sReaderBuffer, 0, 256);
while (count > 0)
{
String tempStr = new String(sReaderBuffer, 0, count);
content.Append(tempStr);
count = sReader.Read(sReaderBuffer, 0, 256);
}
// 讀取結束
sReader.Close();
}
catch (Exception)
{
content = new StringBuilder("Runtime Error");
}
return content.ToString();
}
/// <summary>
/// 好123查詢,符合下列規則也可使用
/// 返回xml
/// 需要順序的節點:
/// QueryResult(查詢結果狀態True,False)
/// Province(所屬省份)
/// City(所屬地區)
/// Corp(服務商)
/// Card(卡類型 GSM)
/// AreaCode(區號)
/// PostCode(郵編)
/// </summary>
/// <param name="url"></param>
/// <param name="mobileNum"></param>
/// <returns></returns>
public static string[] GetInfoByxml(string url, string mobileNum)
{
try
{
XmlDocument xml = new XmlDocument();
// xml.LoadXml("<?xml version='1.0' encoding='utf-8' ?><QueryResponse xmlns='http://api.showji.com/Locating/'><Mobile>15890636739</Mobile><QueryResult>True</QueryResult><Province>河南</Province><City>鄭州</City><AreaCode>0371</AreaCode><PostCode>450000</PostCode><Corp>中國移動</Corp><Card>GSM</Card></QueryResponse>");
xml.Load(string.Format(url, mobileNum));
XmlNamespaceManager xmlNm = new XmlNamespaceManager(xml.NameTable);
xmlNm.AddNamespace("content", "http://api.showji.com/Locating/");
XmlNodeList nodes = xml.SelectNodes("//content:QueryResult|//content:Mobile|//content:Province|//content:City|//content:Corp|//content:Card|//content:AreaCode|//content:PostCode", xmlNm);
if (nodes.Count == 8)
{
if ("True".Equals(nodes[1].InnerText))
{
return new string[] { nodes[0].InnerText, nodes[2].InnerText + nodes[3].InnerText, nodes[6].InnerText + nodes[7].InnerText, nodes[4].InnerText, nodes[5].InnerText };
}
}
return new string[] { "FALSE" };
}
catch
{
return new string[] { "FALSE" };
}
}
//調用方法查詢數據
private void button1_Click(object sender, EventArgs e)
{
foreach (string item in GetInfoByxml(" http://vip.showji.com/locating/?m={0}", txtMobile.Text.Trim()))
{
richTextBox1.Text += "__" + item;
}
}
}
}
運行一下看看效果吧
我是用Winfrom做的測試,大家如果想用Asp。Net也是一樣的,把我的方法複製到你的Web頁面的Cs代碼下就OK了。
好了我們的分析到這裏就算是結束了,
在這裏我再給大空補充一個關於調用帶有證書的網站的調用 方法
因爲帶證書的都是在要驗證證書文件的,我們在這裏直接讓他在本地回調驗證,這樣的話就要吧重寫方法了,下在看一下回調的方法吧
public bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
{ // 總是接受
return true;
}
其它很簡單只要在 我們上面的方法GetUrltoHtml()中加入幾行代碼就行了,修改後的方法
/// 傳入URL返回網頁的html代碼
/// </summary>
/// <param name="Url">URL</param>
/// <returns></returns>
public string GetUrltoHtml(string Url)
{
StringBuilder content = new StringBuilder();
try
{
// 與指定URL創建HTTP請求
ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(CheckValidationResult);//驗證
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
request.KeepAlive = false;
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; MS-RTC LM 8; .NET4.0C; .NET4.0E)";
request.Method = "GET";
request.Accept = "*/*";
//創建證書文件
X509Certificate objx509 = new X509Certificate(Application.StartupPath + "\\123.cer");
//添加到請求裏
request.ClientCertificates.Add(objx509);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
// 獲取對應HTTP請求的響應
// 獲取響應流
Stream responseStream = response.GetResponseStream();
// 對接響應流(以"GBK"字符集)
StreamReader sReader = new StreamReader(responseStream, Encoding.GetEncoding("GBK"));
// 開始讀取數據
Char[] sReaderBuffer = new Char[256];
int count = sReader.Read(sReaderBuffer, 0, 256);
while (count > 0)
{
String tempStr = new String(sReaderBuffer, 0, count);
content.Append(tempStr);
count = sReader.Read(sReaderBuffer, 0, 256);
}
// 讀取結束
sReader.Close();
}
catch (Exception)
{
content = new StringBuilder("Runtime Error");
}
return content.ToString();
}