2013-09-01 283 views
21

我在Windows上测试,试图模拟负载测试的POST请求(具有不同的表单变量)。我已经尝试过各种负载测试软件,但没有得到它的工作。如何模拟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(); 

     } 
    } 

回答

20

你可以尝试http://www.hurl.it这是容易测试的API。

+0

如何发布到内部唯一运行的开发服务器? – stryba

+1

我不确定你可以。如果你想测试开发API,我会建议使用Postman Chrome应用程序,或者如果你想自动测试你的API,你将不得不使用一些自动化工具(例如PHP可以使用Behat) –

+0

准确地说,我的观点。 – stryba

15

如果您提供了更多信息,例如:

例如:

curl --data "post1=value1&post2=value2&etc=valetc" http://host/resource 
你使用,你要完成,等什么,但是,一般来说卷曲是一个非常强大的命令行工具,我经常使用(在Linux)的模仿HTML请求何种操作系统

,或者对于一个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,或任何端口的服务器上),并沿着HTML请求头传递。上面的库的例子去,你的请求头可能如下:

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请求,以及POSTing和PUTing JSON数据。否则,你可能最终会做更多的编程而不是压力测试。希望这可以帮助!

+0

使用Windows操作系统,我想模拟数据POSTS进行负载测试,我试过各种负载测试,但未能得到它的工作 – user1663380

+0

for localhost它似乎并不工作 – user1663380

+0

真的很想写自己的程序,问题是我仍然无法将POST参数成功地放入我的C#代码的webrequest中 – user1663380

4

简单的方法是使用curl通过命令行,例如:

DATA="foo=bar&baz=qux" 
curl --data "$DATA" --request POST --header "Content-Type:application/x-www-form-urlencoded" http://example.com/api/callback | python -m json.tool 

或我这里是如何使用bash shell来发送原始POST请求(JSON请求):

exec 3<> /dev/tcp/example.com/80 

DATA='{"email": "[email protected]"}' 
LEN=$(printf "$DATA" | wc -c) 

cat >&3 << EOF 
POST /api/retrieveInfo HTTP/1.1 
Host: example.com 
User-Agent: Bash 
Accept: */* 
Content-Type:application/json 
Content-Length: $LEN 
Connection: close 

$DATA 
EOF 

# Read response. 
while read line <&3; do 
    echo $line 
done 
0

如果您需要公开曝光的网站,这应该有所帮助网站,但你在一台开发电脑。也可以回答(我目前还不能评论):“我如何发布到内部唯一运行的开发服务器? - stryba” -

NGROK创建一个安全的公共URL到您的开发机器上的本地web服务器(永久收费的网址可免费临时使用)。
1)运行ngrok.exe打开命令行(在桌面上)
2)类型ngrok.exe HTTP 80开始隧道,
3)通过浏览所显示的网页地址的测试,将转发和显示本地您的开发人员电脑上默认80页

然后使用上面推荐的一些工具POST到您的ngrok网站('https://xxxxxx.ngrok.io')来测试您的本地代码。

https://ngrok.com/