C# 使用RestSharp實現Postman中的各種形式的請求


 

https://blog.csdn.net/qq_31025841/article/details/120448324

一、導入命名空間
二、構建客戶端
◆ 創建客戶端對象
◆ 設置當前URL
◆ 設置響應超時
◆ 添加默認Header
◆ 添加單項Cookie
◆ 添加多項Cookie
三、構建請求
◆ 創建請求對象
◆ 添加參數Header
◆ 添加單項Cookie
◆ 添加多項Cookie
◆ 添加參數Params
◆ 添加參數Body
> form-data和x-www-form-urlencoded
> JSON數據
> File上傳
四、執行Request請求
◆ JSON結果
◆ File下載
★ 小技巧 ★ :
淘寶平台Sign算法
一、導入命名空間
using RestSharp;
using Newtonsoft.Json; // 用於JSON序列化/反序列化
using Newtonsoft.Json.Linq; // 用於構建JSON對象
1
2
3
二、構建客戶端
◆ 創建客戶端對象
RestClient client = new RestClient();
1
◆ 設置當前URL
client.BaseUrl = new Uri("https://www.baidu.com/s");
1
◆ 設置響應超時
client.Timeout = -1; // 永不超時
1
◆ 添加默認Header
client.AddDefaultHeader("HeaderKey", "HeaderValue");
1
◆ 添加單項Cookie
client.AddDefaultParameter("itemKey", "itemValue", ParameterType.Cookie);
1
◆ 添加多項Cookie
public void addClientCookies(ref RestClient client, string cookie)
{
string[] cookie_items = cookie.Split(';');
foreach (string cookie_item in cookie_items)
{
if (cookie_item.Trim().Length == 0) continue;
string cookie_key = cookie_item.Substring(0, cookie_item.IndexOf('=')).Trim();
string cookie_value = cookie_item.Substring(cookie_item.IndexOf('=') + 1).Trim();
if (cookie_value.Contains(",")) cookie_value = $"\"{cookie_value}\"";
client.AddDefaultParameter(cookie_key, cookie_value, ParameterType.Cookie);
}
}
// 調用示例
addClientCookies(ref client, "item1=value1;item2=value2")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
三、構建請求
◆ 創建請求對象
RestRequest request = new RestRequest(Method.GET); // Post請求:Method.POST
1
◆ 添加參數Header
request.AddHeader("HeaderKey", "HeaderValue");
1
◆ 添加單項Cookie
request.AddParameter("itemName", "itemValue", ParameterType.Cookie);
1
◆ 添加多項Cookie
public void addRequestCookies(ref RestRequest request, string cookie)
{
string[] cookie_items = cookie.Split(';');
foreach (string cookie_item in cookie_items)
{
if (cookie_item.Trim().Length == 0) continue;
string cookie_key = cookie_item.Substring(0, cookie_item.IndexOf('=')).Trim();
string cookie_value = cookie_item.Substring(cookie_item.IndexOf('=') + 1).Trim();
if (cookie_value.Contains(",")) cookie_value = $"\"{cookie_value}\"";
request.AddParameter(cookie_key, cookie_value, ParameterType.Cookie);
}
}
// 調用示例
addRequestCookies(ref request, "item1=value1;item2=value2")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
◆ 添加參數Params
request.AddQueryParameter("ParamKey", "ParamValue");
1
◆ 添加參數Body
> form-data和x-www-form-urlencoded
request.AddParameter("FormKey", "FormValue");
1
> JSON數據
// 構建需要提交的JSON數據:{"Name": "zhangsan", "Score": [81, 92, 86]}
JObject post_json = new JObject();
post_json.Add("Name", "zhangsan");
JArray score = new JArray() { 81, 92, 86 };
post_json.Add("Score", score);
// 序列化JSON數據
string post_data = JsonConvert.SerializeObject(post_json);
// 將JSON參數添加至請求中
request.AddParameter("application/json", post_data, ParameterType.RequestBody);
1
2
3
4
5
6
7
8
9
> File上傳
request.AddFile("FileKey", @"F:\Demo.txt"); // 添加文件
1
四、執行Request請求
◆ JSON結果
IRestResponse response = client.Execute(request); // 執行請求
string res_text = response.Content; // 文本結果
JObject res_json = (JObject)JsonConvert.DeserializeObject(res_text); // JSON結果
1
2
3
◆ File下載
byte[] response = client.DownloadData(request); // 執行請求
System.IO.File.WriteAllBytes(@"F:\Demo.txt", response); // 將返回結果保存到文件
1
2
★ 小技巧 ★ :
可以使用Fiddler來對比C# RestSharp發送的請求和Postman發送的請求,來測試添加的參數是否達到了同Postman一樣的效果。
對於同個平台下的多個請求,可共用一個Client發送請求,減少不必要的重復設置參數。此方式也可用在存在Cookie返回的場景。
封裝的AddCookies方法對於重復的Cookie鍵只能保留一個,例如淘寶的部分Cookie中含有兩個_tb_token_參數,則需要添加代碼去除掉沒用的那個。
淘寶平台Sign算法
using System.Security.Cryptography;
using System.Text.RegularExpressions;
using System.Text;
1
2
3
public string md5(string inStr)
{
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
byte[] InBytes = Encoding.GetEncoding("utf-8").GetBytes(inStr);
byte[] OutBytes = md5.ComputeHash(InBytes);
string OutString = "";
for (int i = 0; i < OutBytes.Length; i++)
{
OutString += OutBytes[i].ToString("x2");
}
return OutString;
}
public string get_sign(string t, string data, string token)
{
string appKey = "12574478"; //淘寶的APPkey
string pre_sign = string.Format("{0}&{1}&{2}&{3}", token, t, appKey, data);
return md5(pre_sign);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 從Cookie中匹配Sign算法中所需的token
string token = Regex.Match(cookie, @"_m_h5_tk=\w+_").Value.Trim('_').Replace("m_h5_tk=", "");
// 獲取當前時間戳(Sign算法中所需的t參數)
TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
string t = (Convert.ToInt64(ts.TotalSeconds * 1000)).ToString();
// JSON data處理(Sign算法中所需的data參數)
JObject post_json = new JObject();
string data = JsonConvert.SerializeObject(post_json);
// 生成Sign
string sign = get_sign(t, data, token);
1
2
3
4
5
6
7
8
9
10

————————————————
版權聲明:本文為CSDN博主「軟件小哥哥QAQ」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_31025841/article/details/120448324


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM