2013-09-01 62 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/