29

我正在 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();

        }
    }
4

5 回答 5

19

如果您提供更多信息会很有帮助 - 例如您使用什么操作系统,您想要完成什么等。但是,一般来说,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 客户端发送请求不会对您的服务器造成太大压力。


更多编辑

因此,为了模拟套接字上的发布请求,您基本上必须建立与服务器的初始套接字连接。我不是 C# 人,所以我不能确切地告诉你该怎么做;我确信网上有 1001 个 C# 套接字教程。对于大多数 RESTful API,您通常需要提供一个 URI 来告诉服务器要做什么。例如,假设您的 API 管理一个图书馆,并且您正在使用 POST 请求告诉服务器更新关于 id 为“34”的图书的信息。您的 URI 可能是

http://localhost/library/book/34

因此,您应该在端口 80(或 8080,或您的服务器所在的任何端口)上打开到 localhost 的连接,并传递一个 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 请求,以及 POST 和 PUTing JSON 数据。否则,您最终可能会进行比压力测试更多的编程。希望这可以帮助!

于 2013-09-01T08:57:06.763 回答
10

Postman 是测试您的 API 的最佳应用程序!

你可以导入或导出你的路线,让他记住你所有的身体要求!:)

编辑:这条评论是 5 年的旧和弃用:D

这是新的邮递员应用程序: https ://www.postman.com/

于 2015-03-13T17:38:57.880 回答
6

简单的方法是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(JSON 请求)发送原始 POST 请求的示例:

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

DATA='{"email": "foo@example.com"}'
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
于 2016-02-16T15:40:04.217 回答
0

如果您需要一个公开的网站但您使用的是开发电脑,这应该会有所帮助。还要回答(我还不能发表评论):“我如何使用这个发布到仅内部运行的开发服务器? - stryba”

NGROK 为您的开发机器上的本地网络服务器创建一个安全的公共 URL(永久 URL 需要付费,临时 URL 是免费的)。
1) 运行 ngrok.exe 打开命令行(在桌面上)
2) 键入 ngrok.exe http 80 启动隧道,
3) 通过浏览显示的网址进行测试,该网址将转发并在您的开发设备上显示本地默认 80 页面个人电脑

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

https://ngrok.com/

于 2016-10-19T17:02:32.790 回答
0

不要忘记添加用户代理,因为如果没有服务器代理,某些服务器会阻止请求..(你会得到 Forbidden resource response)示例:

curl -X POST -A 'Mozilla/5.0 (X11; Linux x86_64; rv:30.0) Gecko/20100101 Firefox/30.0' -d "field=acaca&name=afadxx" https://example.com
于 2018-05-25T03:18:57.107 回答