我正在 Windows 上进行测试,试图模拟 POST 请求(使用不同的表单变量)进行负载测试。我尝试了各种负载测试软件,但都无法正常工作。
对于 GET 请求,我知道我可以将参数放在 url 后面
http://www.example.com?id=yyy&t=zzz
但是如何模拟 POST 请求呢?
我有一个 chrome REST 客户端,但我不知道在标题和数据中放什么。
这是我迄今为止尝试过的:
class Program
{
static void Main(string[] args)
{
string viewstateid = "/wEPDwUKLTY3NjEyMzE4NWRkK4DxZpjTmZg/RGCS2s13vkEWmwWiEE6v+XrYoWVuxeg=";
string eventid ="/wEdAAoSjOGPZYAAeKGjkZOhQ+aKHfOfr91+YI2XVhP1c/pGR96FYSfo5JULYVvfQ61/Uw4pNGL67qcLo0vAZTfi8zd7jfuWZzOhk6V/gFA/hhJU2fx7PQKw+iST15SoB1LqJ4UpaL7786dp6laCBt9ubQNrfzeO+rrTK8MaO2KNxeFaDhrQ0hxxv9lBZnM1SHtoODXsNUYlOeO/kawcn9fX0BpWN7Brh7U3BIQTZwMNkOzIy+rv+Sj8XkEEA9HaBwlaEjg=";
string username = "user1";
string password = "ttee";
string loginbutton = "Log In";
string URLAuth = "http://localhost/login.aspx";
string postString = string.Format("VIEWSTATE={0}&EVENTVALIDATION={1}&LoginUser_UserName={2}&LoginUser_Password={3}&LoginUser_LoginButton={4}",viewstateid,eventid, username, password,realm,otp,loginbutton);
const string contentType = "application/x-www-form-urlencoded";
System.Net.ServicePointManager.Expect100Continue = false;
CookieContainer cookies = new CookieContainer();
HttpWebRequest webRequest = WebRequest.Create(URLAuth) as HttpWebRequest;
webRequest.Method = "POST";
webRequest.ContentType = contentType;
webRequest.CookieContainer = cookies;
webRequest.ContentLength = postString.Length;
webRequest.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.1";
webRequest.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
webRequest.Referer = "http://localhost/login.aspx";
StreamWriter requestWriter = new StreamWriter(webRequest.GetRequestStream());
requestWriter.Write(postString);
requestWriter.Close();
StreamReader responseReader = new StreamReader(webRequest.GetResponse().GetResponseStream());
string responseData = responseReader.ReadToEnd();
Console.WriteLine(responseData);
responseReader.Close();
webRequest.GetResponse().Close();
}
}
最佳答案
如果您提供更多信息会有所帮助 - 例如你使用什么操作系统,你想要完成什么等等。但是,一般来说,cURL 是一个非常强大的命令行工具,我经常使用(在 linux 中)来模仿 HTML 请求:
例如:
curl --data "post1=value1&post2=value2&etc=valetc" http://host/resource
或者,对于 RESTful API:
curl -X POST -d @file http://host/resource
您可以在这里查看更多信息-> http://curl.haxx.se/
编辑:
好的。所以基本上你想对你的 REST 服务器进行压力测试?除非您想编写自己的负载测试程序,否则 cURL 真的没有帮助,即使如此,套接字也是要走的路。我建议您查看 Gatling . Gatling 文档解释了如何设置该工具,您可以从那里运行各种 GET、POST、PUT 和 DELETE 请求。
不幸的是,如果没有编写自己的程序——即产生一大堆线程并用不同类型的请求淹没你的 REST 服务器——你真的必须依赖压力/负载测试工具包。仅使用 REST 客户端发送请求不会给您的服务器带来太大压力。
更多编辑
因此,为了在套接字上模拟 post 请求,您基本上必须建立与服务器的初始套接字连接。我不是一个 C# 人,所以我不能确切地告诉你如何做到这一点;我确定网上有 1001 个 C# 套接字教程。对于大多数 RESTful API,您通常需要提供一个 URI 来告诉服务器该做什么。例如,假设您的 API 管理一个图书馆,并且您正在使用 POST 请求告诉服务器更新有关 id 为“34”的书籍的信息。您的 URI 可能是
http://localhost/library/book/34
因此,您应该在端口 80(或 8080,或您的服务器所在的任何端口)上打开到 localhost 的连接,并传递 HTML 请求 header 。使用上面的库示例,您的请求 header 可能如下所示:
POST library/book/34 HTTP/1.0\r\n
X-Requested-With: XMLHttpRequest\r\n
Content-Type: text/html\r\n
Referer: localhost\r\n
Content-length: 36\r\n\r\n
title=Learning+REST&author=Some+Name
从这里开始,服务器应该返回一个响应头,然后是 API 被编程来告诉客户端的任何东西——通常是说 POST 成功或失败。要对您的 API 进行压力测试,您基本上应该通过创建线程化进程一遍又一遍地执行此操作。
此外,如果您要发布 JSON 数据,则必须相应地更改标题和内容。坦率地说,如果您希望快速而干净地执行此操作,我建议使用 python(或 perl),它具有多个用于创建 POST、PUT、GET 和 DELETE 请求以及 POST 和 PUTing JSON 数据的库。否则,您最终可能会做更多的编程而不是压力测试。希望这可以帮助!
关于http-post - 如何模拟POST请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18556680/