1. 程式人生 > 其它 >模擬瀏覽器請求(WebRequest)

模擬瀏覽器請求(WebRequest)

原文地址:https://www.cnblogs.com/mafei2014/articles/4316375.html

運用場景: 現在假設有兩個公司A 和 B,現在A公司想要訪問B公司的的資料,而B公司我們不能直接的就把資料庫暴露給A公司,於是B公司給A公司提供的一個請求url,通過這個請求就可以訪問到B公司提供給A公司的請求,但是現在問題來了,A公司怎樣通過B公司提供的url去獲取想要的資料呢?於是乎,今天就學習了一下WebRequest這個類,以下是筆記。

1、這個是提供資料的解決方案中的程式碼,相當於B公司提供的介面(WebAPI)【B解決方案】

public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
// 其他公司傳遞過來的引數
string blockType = context.Request.Params["BlockType"];
///string blockNo = context.Request.Params["BlockNo"];
if (!string.IsNullOrEmpty(blockType) && blockType.Equals("SZ",StringComparison.OrdinalIgnoreCase))
{
List<Block> blockList = new List<Block>() {
new Block(){BlockNo=000001,BlockName="SHENHONG"},
new Block(){BlockNo=000002,BlockName="SHENHONG2"},
new Block(){BlockNo=000003,BlockName="SHENHONG3"}
};

// blockList.Where(c=>c.BlockNo == Convert.ToInt32(blockNo));

JavaScriptSerializer serializer = new JavaScriptSerializer();
string json = serializer.Serialize(blockList);

context.Response.Write(json);
}

}

2、以下是需要通過提供的url(介面)模擬瀏覽器請求的程式碼,相當於A公司【A解決方案】

protected void submit_Click(object sender, EventArgs e)
{
// 模擬請求http://localhost:3536/GetBlockData.ashx?blockType=SZ
string requestUrl = "http://localhost:3536/GetBlockData.ashx?blockType=SZ&blockNo="+tbBlockNo.Text.Trim();
// 1.0 建立 WebRequest 請求物件。
WebRequest request = WebRequest.Create(requestUrl);
// 1.1 設定請求的方法
request.Method = "Get";
// 1.2 傳送請求並接收請求返回來的響應
WebResponse responseBody = request.GetResponse();
Stream stream = responseBody.GetResponseStream();
//1.3 把流讀取為字串
string responseContent = string.Empty;
using (StreamReader sr = new StreamReader(stream))
{
responseContent = sr.ReadToEnd();
}
Response.Write(responseContent);
}

總結:在web運用的時候,我們總有可能會遇到像以上情況那樣,需要和其他公司合作的情況,這就需要提供資料的公司寫WebAPI(介面),而需要資料的公司寫的關鍵點就是 模擬瀏覽器發出請求,而目前接觸的程式碼中可以通過WebReqeust類以及其相關的方法實現資料的獲取。

擴充套件: 像網路爬蟲估計是這麼做的,不過爬取的網站返回的資料格式不一樣,所以有不同的處理方式,如XML,HTML,JSON.(關於爬蟲,後期去嘗試)

                                                       2015-03-05

(2015年12月15日)
補充說明:今日在請求基於 HTTPS 的 webapi 時報錯,錯誤提示是:未能為SSL/TLS安全通道建立信任的解決辦法,解決方案如下

1 public class WebReqeustHelper
2 {
3 public static string GetResponseContent(string RequestUrl)
4 {
5 ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
6 string url = RequestUrl;
7 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
8 HttpWebResponse response = (HttpWebResponse)request.GetResponse();
9 string encoding = response.ContentEncoding;
10 if (encoding == null || encoding.Length < 1)
11 {
12 encoding = "UTF-8"; //預設編碼
13 }
14 StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding(encoding));
15 string content = reader.ReadToEnd();
16 response.Close();
17 return content;
18 }
19
20 public static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
21 {
22 return true; //總是接受
23 }
24
25 }

解決方案,驗證伺服器證書自動驗證

2. 對webAPI的另外一種請求方式,新增引用 RestSharp.dll ,學習源http://restsharp.org/

public string API
{
set
{
if (value != null)
{
api = value;
}
}
get
{
return api;
}
}


#region 0.1 api呼叫

#region 1.1 Post呼叫 引數為model
/// <summary>
/// Post呼叫 引數為model
/// </summary>
/// <param name="url">請求的url</param>
/// <param name="requestbody">引數</param>
/// <param name="contentType">Content-Type</param>
/// <param name="charset">編碼</param>
/// <returns>dynamic{Status=200,Content=""}</returns>
public dynamic PostApi(string url, object requestbody, string contentType = "application/json", string charset = "utf-8")
{
dynamic data = new ExpandoObject();

JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer();
string jsonExtend = javaScriptSerializer.Serialize(requestbody);
var client = new RestClient(api + url);
var request = new RestRequest(Method.POST);
if (requestbody != null)
{
request.AddParameter("application/json; charset=utf-8", jsonExtend, ParameterType.RequestBody);
}
try
{
IRestResponse response = client.Execute(request);
data.Status = HttpStatusCode.OK;
data.Content = response.Content;
}
catch (Exception ex)
{
data.Status = HttpStatusCode.BadRequest;
data.Content = ex.Message;
}

return data;
}
#endregion

#region 1.2 Get|Post url+引數呼叫
/// <summary>
/// Get|Post url+引數呼叫
/// </summary>
/// <param name="url">請求的url</param>
/// <param name="method">請求方式</param>
/// <returns>dynamic{Status=200,Content=""}</returns>
public dynamic Get_Post_Api(string url, Method method = Method.GET)
{
dynamic data = new ExpandoObject();

var client = new RestClient(api + url);
var request = new RestRequest(method);
try
{
IRestResponse response = client.Execute(request);
data.Status = HttpStatusCode.OK;
data.Content = response.Content;
}
catch (Exception ex)
{
data.Status = HttpStatusCode.BadRequest;
data.Content = ex.Message;
}

return data;
}
#endregion

RestSharp 封裝