HTTP協議報文有了充分了解之后,上一節我們對get請求進行了詳盡的測試,由于get請求沒有請求體,相對來說比較簡單,接下來我們加上請求體,看看使用post接口如何完成各種不同類型請求體的請求操作。
需要注意的是,post請求也并不一定都有請求體,遇到沒有請求體的post接口,處理方式和get請求完全一致。
請求需要用到的四要素中:HTTP方法和url地址是顯而易見的;沒有特殊說明時,基本的請求頭不需要關注,Postman會自動添加;重點關注請求體以及與它配套的Content-Type頭域。
常用的接口測試請求體的編輯格式包括如下幾種,和Content-Type頭域分別對應:
這里的Content-Type頭域和請求體的關系,相當于快遞運輸時的運輸方式,比如請求體是水,就用常溫運輸,如果是冰,就需要冷藏的方式運輸了。
接下來幾節,我們分別來看各種請求體格式應該如何使用Postman完成請求。
請求示例:
本例使用的接口為電商項目登錄接口,接口信息如下
通過抓包獲取接口的基本信息,可以看到請求頭中Content-Type字段值為application/x-www-form-urlencoded,它的格式我們非常熟悉,和url中?后面的參數格式相同,為鍵=值&鍵=值得格式。
可以在fiddler或者其它抓包工具中查看請求參數的美化組織格式,上述請求體對應于webform格式下的請求體內容以表格形式顯示如下:
Postman完成請求:
針對application/x-www-form-urlencoded格式,可以用兩種方式在postman的Body菜單中填寫:
注意不要把請求url地址的參數也填寫進來了,那些參數在Params菜單中。
編輯完請求體之后可以查看Headers中的頭域信息,會發現除了基本頭域以外,加入了Content-Type和Content-Length兩個頭域,分別表示請求體的類型和長度。
由此可見,當選擇x-www-form-urlencoded時,postman會自動在頭域中添加請求體相關的頭域參數設置。
這里返回體格式直接以純文本形式當做HTML顯示,其中的中文內容還是未經處理的unicode編碼,可以通過切換返回體的格式下拉欄菜單為JSON,以美化后的格式顯示,并對中文等特殊符號進行轉碼。
在Body菜單中選擇raw格式,然后將原始url編碼字符串直接粘貼進輸入欄中,發起請求會發現返回結果是請填寫賬號或密碼,說明我們的請求體內容中攜帶的用戶名密碼等信息并沒有被服務器接受。
切換到Headers中查看,會發現其中的Content-Type并不是applicaiton/x-www-form-urlencoded,而是text/plain純文本格式的請求,因而才會導致請求體格式不被服務器接受。
相當于服務器原本是希望收到冷凍起來的冰,而我們卻選擇了常溫運輸方式,服務器也就認為自己沒有收到需要的用戶名密碼。
因此我們要做的處理是在Headers中修改Content-Type的值,由于原本自動添加的Content-Type不能修改,因此取消勾選并新增一個Content-Type,值為application/x-www-form-urlencoded
重新發送之后,就可以得到正確的請求結果了。
希望本文對你有所幫助~~如果對軟件測試、接口測試、自動化測試、面試經驗交流感興趣可以私聊我或關注公眾號“特斯汀軟件測試”。免費領取最新軟件測試大廠面試資料和Python自動化、接口、框架搭建學習資料!技術大牛解惑答疑,同行一起交流。
NET (C#) 中,發送 HTTP GET 和 POST 請求可以通過多種方式實現,主要依賴于 .NET Framework 或 .NET Core/5+ 的版本。.NET中提供了多種方法來發送HTTP請求,每種方法都有其優缺點。選擇哪種方法取決于具體需求和環境。
HttpClient 是 .NET 中處理 HTTP 請求的現代方法。它是線程安全的,支持異步操作,并且可以用于多個請求。
適用平臺:.NET Framework 4.5+, .NET Standard 1.1+, .NET Core 1.0+
其它平臺的移植版本可以通過Nuget來安裝。(Nuget使用方法:VS(Visual Studio)中Nuget的使用-CJavaPy)
命名空間:using System.Net.Http;
HttpClient推薦使用單一實例共享使用,發關請求的方法推薦使用異步的方式,代碼如下,
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Http;
namespace ConsoleApplication
{
class Program
{
private static readonly HttpClient client = new HttpClient();
static void Main(string[] args)
{
//發送Get請求
var responseString = await client.GetStringAsync("http://www.example.com/recepticle.aspx");
//發送Post請求
var values = new Dictionary
{
{ "thing1", "hello" },
{ "thing2", "world" }
};
var content = new FormUrlEncodedContent(values);
var response = await client.PostAsync("http://www.example.com/recepticle.aspx", content);
var responseString = await response.Content.ReadAsStringAsync();
}
}
}
2、使用第三方類庫
除了上述方法,還有許多第三方庫可以用于發送HTTP請求,例如 RestSharp 和 Flurl。這些庫通常提供更高級的功能,例如支持多種身份驗證方法和自動重試機制。
1)Flurl.Http(可以通過Nuget來安裝)
Flurl.Http 是一個在 .NET 環境下使用的流行的 HTTP 客戶端庫。它提供了一個簡潔的 API 來創建 HTTP 請求,并支持異步操作。Flurl.Http 使得發送 HTTP 請求、接收響應、處理異常和解析數據變得非常簡單。
命名空間:using Flurl.Http;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Flurl.Http;
namespace ConsoleApplication
{
class Program
{
public static async Task Main(string[] args)
{
// 示例URL
string getUrl = "https://example.com";
string postUrl = "https://example.com/post";
// 發送GET請求
string htmlContent = await GetHtmlAsync(getUrl);
Console.WriteLine("GET請求結果:");
Console.WriteLine(htmlContent);
// 發送POST請求
var postData = new { Name = "John", Age = 30 };
var postResponse = await PostJsonAsync<object>(postUrl, postData);
Console.WriteLine("POST請求結果:");
Console.WriteLine(postResponse);
// 發送帶有查詢參數和頭信息的GET請求
string htmlContentWithHeaders = await GetHtmlWithHeadersAsync(getUrl);
Console.WriteLine("帶查詢參數和頭信息的GET請求結果:");
Console.WriteLine(htmlContentWithHeaders);
// 安全地發送GET請求
string safeHtmlContent = await SafeRequestAsync(getUrl);
Console.WriteLine("安全GET請求結果:");
Console.WriteLine(safeHtmlContent);
}
public static async Task<string> GetHtmlAsync(string url)
{
return await url.GetStringAsync();
}
public static async Task<TResponse> PostJsonAsync<TResponse >(string url, object data)
{
return await url
.PostJsonAsync(data)
.ReceiveJson<TResponse>();
}
public static async Task<string> GetHtmlWithHeadersAsync(string url)
{
return await url
.SetQueryParams(new { param1 = "value1", param2 = "value2" })
.WithHeader("Accept", "application/json")
.GetStringAsync();
}
public static async Task<string> SafeRequestAsync(string url)
{
try
{
return await url.GetStringAsync();
}
catch (FlurlHttpException ex)
{
return "HTTP Error: " + ex.Message;
}
catch (Exception ex)
{
return "General Error: " + ex.Message;
}
}
}
}
2)RestSharp(可以通過Nuget來安裝)
RestSharp 是一個用于在 .NET 中發送 HTTP 請求的簡單 REST 和 HTTP API 客戶端。它可以用于構建和發送各種 HTTP 請求,并處理響應。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using RestSharp;
namespace ConsoleApplication
{
class Program
{
static void Main(string[] args)
{
//發送Get和Post請求
RestClient client = new RestClient("http://example.com");//指定請求的url
RestRequest req = new RestRequest("resource/{id}", Method.GET);//指定請求的方式,如果Post則改成Method.POST
request.AddParameter("name", "value"); // 添加參數到 URL querystring
request.AddUrlSegment("id", "123"); //替換上面指定請求方式中的{id}參數
//req.AddBody(body); /*如發送post請求,則用req.AddBody ()指定body內容*/
//發送請求得到請求的內容
//如果有header可以使用下面方法添加
//request.AddHeader("header", "value");
IRestResponse response = client.Execute(request);
//上傳一個文件
//request.AddFile("file", path);
var content = response.Content; // 未處理的content是string
//還可以下面幾種方式發送請求
//發送請求,反序列化請求結果
IRestResponse response2 = client.Execute(request);
var name = response2.Data.Name;
//發送請求下載一個文件,并保存到path路徑
client.DownloadData(request).SaveAs(path);
// 簡單發送異步請求
await client.ExecuteAsync(request);
// 發送異常請求并且反序列化結果
var asyncHandle = client.ExecuteAsync(request, response => {
Console.WriteLine(response.Data.Name);
});
//終止異步的請求
asyncHandle.Abort();
}
}
}
較舊的方法,現在通常推薦使用 HttpClient。但在一些舊項目或特定場景下,WebRequest 和 WebResponse 仍然有用。
適用平臺:.NET Framework 1.1+, .NET Standard 2.0+, .NET Core 1.0+
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.IO; // for StreamReader
namespace ConsoleApplication
{
class Program
{
static void Main(string[] args)
{
//發送Get請求
var request = (HttpWebRequest)WebRequest.Create("http://www.example.com/recepticle.aspx");
var response = (HttpWebResponse)request.GetResponse();
var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
//發送Post請求
var request = (HttpWebRequest)WebRequest.Create("http://www.example.com/recepticle.aspx");
var postData = "thing1=hello";
postData += "&thing2=world";
var data = Encoding.ASCII.GetBytes(postData);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = data.Length;
using (var stream = request.GetRequestStream())
{
stream.Write(data, 0, data.Length);
}
var response = (HttpWebResponse)request.GetResponse();
var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
}
}
}
C#中,WebClient類提供了一個簡單的方法來發送和接收數據到和從一個URI(如一個網頁或Web服務)上。
適用平臺:.NET Framework 1.1+, .NET Standard 2.0+, .NET Core 2.0+
我們在Web表單提交,常常需要選擇提交方法,這時我們會用到GET和POST方法。但關于它們之間的區別你又知道多少。今天我們就來了解它們
兩方法其實是HTTP協議中的請求方法(關于HTTP協議可以閱讀之前我寫的《解密Web通信協議——超文本傳輸協議》)我們先通過一個例子來看看它們之間的區別。
通過下面源代碼來查看:
源代碼
效果
我們來看一下地址欄無輸入時為:
file:///E:/~/~/Demo.html
我們測試時用戶名和密碼都為123456789
當我們用GET方法提交地址欄變為:
file:///E:/~/~/Demo.html?textfield=123456789&password=123456789&submit=提交#Url
再來看看post方法提交后為file:///E:/~/~/Demo.html#Url
我們不難看出當我們在輸入密碼時Get方法提交會把所有信息顯示到地址欄,這樣可以看出這樣提交信息不安全。
它們沒有很大區別都是TCP連接,但在HTTP規范不同和C/S限制導致它們有了區別如下:
私密性的信息請求使用post。
查詢信息和可以想要通過url分享的信息使用get。
如果有任何錯誤和紕漏,請私信我更正。
如果你有任何意見一定要私信告訴我,讓我快速成長起來喲。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。