Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
HTTP協(xié)議報(bào)文有了充分了解之后,上一節(jié)我們對(duì)get請(qǐng)求進(jìn)行了詳盡的測(cè)試,由于get請(qǐng)求沒有請(qǐng)求體,相對(duì)來(lái)說比較簡(jiǎn)單,接下來(lái)我們加上請(qǐng)求體,看看使用post接口如何完成各種不同類型請(qǐng)求體的請(qǐng)求操作。
需要注意的是,post請(qǐng)求也并不一定都有請(qǐng)求體,遇到?jīng)]有請(qǐng)求體的post接口,處理方式和get請(qǐng)求完全一致。
請(qǐng)求需要用到的四要素中:HTTP方法和url地址是顯而易見的;沒有特殊說明時(shí),基本的請(qǐng)求頭不需要關(guān)注,Postman會(huì)自動(dòng)添加;重點(diǎn)關(guān)注請(qǐng)求體以及與它配套的Content-Type頭域。
常用的接口測(cè)試請(qǐng)求體的編輯格式包括如下幾種,和Content-Type頭域分別對(duì)應(yīng):
這里的Content-Type頭域和請(qǐng)求體的關(guān)系,相當(dāng)于快遞運(yùn)輸時(shí)的運(yùn)輸方式,比如請(qǐng)求體是水,就用常溫運(yùn)輸,如果是冰,就需要冷藏的方式運(yùn)輸了。
接下來(lái)幾節(jié),我們分別來(lái)看各種請(qǐng)求體格式應(yīng)該如何使用Postman完成請(qǐng)求。
請(qǐng)求示例:
本例使用的接口為電商項(xiàng)目登錄接口,接口信息如下
通過抓包獲取接口的基本信息,可以看到請(qǐng)求頭中Content-Type字段值為application/x-www-form-urlencoded,它的格式我們非常熟悉,和url中?后面的參數(shù)格式相同,為鍵=值&鍵=值得格式。
可以在fiddler或者其它抓包工具中查看請(qǐng)求參數(shù)的美化組織格式,上述請(qǐng)求體對(duì)應(yīng)于webform格式下的請(qǐng)求體內(nèi)容以表格形式顯示如下:
Postman完成請(qǐng)求:
針對(duì)application/x-www-form-urlencoded格式,可以用兩種方式在postman的Body菜單中填寫:
注意不要把請(qǐng)求url地址的參數(shù)也填寫進(jìn)來(lái)了,那些參數(shù)在Params菜單中。
編輯完請(qǐng)求體之后可以查看Headers中的頭域信息,會(huì)發(fā)現(xiàn)除了基本頭域以外,加入了Content-Type和Content-Length兩個(gè)頭域,分別表示請(qǐng)求體的類型和長(zhǎng)度。
由此可見,當(dāng)選擇x-www-form-urlencoded時(shí),postman會(huì)自動(dòng)在頭域中添加請(qǐng)求體相關(guān)的頭域參數(shù)設(shè)置。
這里返回體格式直接以純文本形式當(dāng)做HTML顯示,其中的中文內(nèi)容還是未經(jīng)處理的unicode編碼,可以通過切換返回體的格式下拉欄菜單為JSON,以美化后的格式顯示,并對(duì)中文等特殊符號(hào)進(jìn)行轉(zhuǎn)碼。
在Body菜單中選擇raw格式,然后將原始url編碼字符串直接粘貼進(jìn)輸入欄中,發(fā)起請(qǐng)求會(huì)發(fā)現(xiàn)返回結(jié)果是請(qǐng)?zhí)顚戀~號(hào)或密碼,說明我們的請(qǐng)求體內(nèi)容中攜帶的用戶名密碼等信息并沒有被服務(wù)器接受。
切換到Headers中查看,會(huì)發(fā)現(xiàn)其中的Content-Type并不是applicaiton/x-www-form-urlencoded,而是text/plain純文本格式的請(qǐng)求,因而才會(huì)導(dǎo)致請(qǐng)求體格式不被服務(wù)器接受。
相當(dāng)于服務(wù)器原本是希望收到冷凍起來(lái)的冰,而我們卻選擇了常溫運(yùn)輸方式,服務(wù)器也就認(rèn)為自己沒有收到需要的用戶名密碼。
因此我們要做的處理是在Headers中修改Content-Type的值,由于原本自動(dòng)添加的Content-Type不能修改,因此取消勾選并新增一個(gè)Content-Type,值為application/x-www-form-urlencoded
重新發(fā)送之后,就可以得到正確的請(qǐng)求結(jié)果了。
希望本文對(duì)你有所幫助~~如果對(duì)軟件測(cè)試、接口測(cè)試、自動(dòng)化測(cè)試、面試經(jīng)驗(yàn)交流感興趣可以私聊我或關(guān)注公眾號(hào)“特斯汀軟件測(cè)試”。免費(fèi)領(lǐng)取最新軟件測(cè)試大廠面試資料和Python自動(dòng)化、接口、框架搭建學(xué)習(xí)資料!技術(shù)大牛解惑答疑,同行一起交流。
NET (C#) 中,發(fā)送 HTTP GET 和 POST 請(qǐng)求可以通過多種方式實(shí)現(xiàn),主要依賴于 .NET Framework 或 .NET Core/5+ 的版本。.NET中提供了多種方法來(lái)發(fā)送HTTP請(qǐng)求,每種方法都有其優(yōu)缺點(diǎn)。選擇哪種方法取決于具體需求和環(huán)境。
HttpClient 是 .NET 中處理 HTTP 請(qǐng)求的現(xiàn)代方法。它是線程安全的,支持異步操作,并且可以用于多個(gè)請(qǐng)求。
適用平臺(tái):.NET Framework 4.5+, .NET Standard 1.1+, .NET Core 1.0+
其它平臺(tái)的移植版本可以通過Nuget來(lái)安裝。(Nuget使用方法:VS(Visual Studio)中Nuget的使用-CJavaPy)
命名空間:using System.Net.Http;
HttpClient推薦使用單一實(shí)例共享使用,發(fā)關(guān)請(qǐng)求的方法推薦使用異步的方式,代碼如下,
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)
{
//發(fā)送Get請(qǐng)求
var responseString = await client.GetStringAsync("http://www.example.com/recepticle.aspx");
//發(fā)送Post請(qǐng)求
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、使用第三方類庫(kù)
除了上述方法,還有許多第三方庫(kù)可以用于發(fā)送HTTP請(qǐng)求,例如 RestSharp 和 Flurl。這些庫(kù)通常提供更高級(jí)的功能,例如支持多種身份驗(yàn)證方法和自動(dòng)重試機(jī)制。
1)Flurl.Http(可以通過Nuget來(lái)安裝)
Flurl.Http 是一個(gè)在 .NET 環(huán)境下使用的流行的 HTTP 客戶端庫(kù)。它提供了一個(gè)簡(jiǎn)潔的 API 來(lái)創(chuàng)建 HTTP 請(qǐng)求,并支持異步操作。Flurl.Http 使得發(fā)送 HTTP 請(qǐng)求、接收響應(yīng)、處理異常和解析數(shù)據(jù)變得非常簡(jiǎn)單。
命名空間: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";
// 發(fā)送GET請(qǐng)求
string htmlContent = await GetHtmlAsync(getUrl);
Console.WriteLine("GET請(qǐng)求結(jié)果:");
Console.WriteLine(htmlContent);
// 發(fā)送POST請(qǐng)求
var postData = new { Name = "John", Age = 30 };
var postResponse = await PostJsonAsync<object>(postUrl, postData);
Console.WriteLine("POST請(qǐng)求結(jié)果:");
Console.WriteLine(postResponse);
// 發(fā)送帶有查詢參數(shù)和頭信息的GET請(qǐng)求
string htmlContentWithHeaders = await GetHtmlWithHeadersAsync(getUrl);
Console.WriteLine("帶查詢參數(shù)和頭信息的GET請(qǐng)求結(jié)果:");
Console.WriteLine(htmlContentWithHeaders);
// 安全地發(fā)送GET請(qǐng)求
string safeHtmlContent = await SafeRequestAsync(getUrl);
Console.WriteLine("安全GET請(qǐng)求結(jié)果:");
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來(lái)安裝)
RestSharp 是一個(gè)用于在 .NET 中發(fā)送 HTTP 請(qǐng)求的簡(jiǎn)單 REST 和 HTTP API 客戶端。它可以用于構(gòu)建和發(fā)送各種 HTTP 請(qǐng)求,并處理響應(yīng)。
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)
{
//發(fā)送Get和Post請(qǐng)求
RestClient client = new RestClient("http://example.com");//指定請(qǐng)求的url
RestRequest req = new RestRequest("resource/{id}", Method.GET);//指定請(qǐng)求的方式,如果Post則改成Method.POST
request.AddParameter("name", "value"); // 添加參數(shù)到 URL querystring
request.AddUrlSegment("id", "123"); //替換上面指定請(qǐng)求方式中的{id}參數(shù)
//req.AddBody(body); /*如發(fā)送post請(qǐng)求,則用req.AddBody ()指定body內(nèi)容*/
//發(fā)送請(qǐng)求得到請(qǐng)求的內(nèi)容
//如果有header可以使用下面方法添加
//request.AddHeader("header", "value");
IRestResponse response = client.Execute(request);
//上傳一個(gè)文件
//request.AddFile("file", path);
var content = response.Content; // 未處理的content是string
//還可以下面幾種方式發(fā)送請(qǐng)求
//發(fā)送請(qǐng)求,反序列化請(qǐng)求結(jié)果
IRestResponse response2 = client.Execute(request);
var name = response2.Data.Name;
//發(fā)送請(qǐng)求下載一個(gè)文件,并保存到path路徑
client.DownloadData(request).SaveAs(path);
// 簡(jiǎn)單發(fā)送異步請(qǐng)求
await client.ExecuteAsync(request);
// 發(fā)送異常請(qǐng)求并且反序列化結(jié)果
var asyncHandle = client.ExecuteAsync(request, response => {
Console.WriteLine(response.Data.Name);
});
//終止異步的請(qǐng)求
asyncHandle.Abort();
}
}
}
較舊的方法,現(xiàn)在通常推薦使用 HttpClient。但在一些舊項(xiàng)目或特定場(chǎng)景下,WebRequest 和 WebResponse 仍然有用。
適用平臺(tái):.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)
{
//發(fā)送Get請(qǐng)求
var request = (HttpWebRequest)WebRequest.Create("http://www.example.com/recepticle.aspx");
var response = (HttpWebResponse)request.GetResponse();
var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
//發(fā)送Post請(qǐng)求
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類提供了一個(gè)簡(jiǎn)單的方法來(lái)發(fā)送和接收數(shù)據(jù)到和從一個(gè)URI(如一個(gè)網(wǎng)頁(yè)或Web服務(wù))上。
適用平臺(tái):.NET Framework 1.1+, .NET Standard 2.0+, .NET Core 2.0+
我們?cè)赪eb表單提交,常常需要選擇提交方法,這時(shí)我們會(huì)用到GET和POST方法。但關(guān)于它們之間的區(qū)別你又知道多少。今天我們就來(lái)了解它們
兩方法其實(shí)是HTTP協(xié)議中的請(qǐng)求方法(關(guān)于HTTP協(xié)議可以閱讀之前我寫的《解密Web通信協(xié)議——超文本傳輸協(xié)議》)我們先通過一個(gè)例子來(lái)看看它們之間的區(qū)別。
通過下面源代碼來(lái)查看:
源代碼
效果
我們來(lái)看一下地址欄無(wú)輸入時(shí)為:
file:///E:/~/~/Demo.html
我們測(cè)試時(shí)用戶名和密碼都為123456789
當(dāng)我們用GET方法提交地址欄變?yōu)椋?/p>
file:///E:/~/~/Demo.html?textfield=123456789&password=123456789&submit=提交#Url
再來(lái)看看post方法提交后為file:///E:/~/~/Demo.html#Url
我們不難看出當(dāng)我們?cè)谳斎朊艽a時(shí)Get方法提交會(huì)把所有信息顯示到地址欄,這樣可以看出這樣提交信息不安全。
它們沒有很大區(qū)別都是TCP連接,但在HTTP規(guī)范不同和C/S限制導(dǎo)致它們有了區(qū)別如下:
私密性的信息請(qǐng)求使用post。
查詢信息和可以想要通過url分享的信息使用get。
如果有任何錯(cuò)誤和紕漏,請(qǐng)私信我更正。
如果你有任何意見一定要私信告訴我,讓我快速成長(zhǎng)起來(lái)喲。
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。