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小时内与您取得联系。