Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to simulate POST request?

Tags:

http-post

I'm testing on Windows, trying to simulate POST requests (with different form variables) for load testing. I have tried all kinds of load testing software but failed to get it working.

For GET requests, I know I can just put parameters behind the url

http://www.example.com?id=yyy&t=zzz

But how do I simulate a POST request?

I have a chrome REST Client but I do not know what to put in the headers and data.

Here's what I've tried so far:

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();          }     } 
like image 951
user1663380 Avatar asked Sep 01 '13 08:09

user1663380


People also ask

How do I test a HTTP POST request?

Here are some tips for testing POST requests: Create a resource with a POST request and ensure a 200 status code is returned. Next, make a GET request for that resource, and ensure the data was saved correctly. Add tests that ensure POST requests fail with incorrect or ill-formatted data.

How do I request a POST URL?

POST request in itself means sending information in the body. I found a fairly simple way to do this. Use Postman by Google, which allows you to specify the content-type (a header field) as application/json and then provide name-value pairs as parameters. Just use your URL in the place of theirs.

How do I send a POST request in Chrome?

Type the url in the main input field and choose the method to use: GET/POST/PUT/DELETE/PATCH. Click on the arrow "Send" or press Ctrl+Enter.

What program would you use to send a POST request?

Postman is a complete toolchain for API development. You can get Postman as a Chrome extension, or download the app here. Postman is open source on Mac, Windows, and Linux.


2 Answers

It would be helpful if you provided more information - e.g. what OS your using, what you want to accomplish, etc. But, generally speaking cURL is a very powerful command-line tool I frequently use (in linux) for imitating HTML requests:

For example:

curl --data "post1=value1&post2=value2&etc=valetc" http://host/resource 

OR, for a RESTful API:

curl -X POST -d @file http://host/resource 

You can check out more information here-> http://curl.haxx.se/


EDITs:

OK. So basically you're looking to stress test your REST server? Then cURL really isn't helpful unless you want to write your own load-testing program, even then sockets would be the way to go. I would suggest you check out Gatling. The Gatling documentation explains how to set up the tool, and from there your can run all kinds of GET, POST, PUT and DELETE requests.

Unfortunately, short of writing your own program - i.e. spawning a whole bunch of threads and inundating your REST server with different types of requests - you really have to rely on a stress/load-testing toolkit. Just using a REST client to send requests isn't going to put much stress on your server.


More EDITs

So in order to simulate a post request on a socket, you basically have to build the initial socket connection with the server. I am not a C# guy, so I can't tell you exactly how to do that; I'm sure there are 1001 C# socket tutorials on the web. With most RESTful APIs you usually need to provide a URI to tell the server what to do. For example, let's say your API manages a library, and you are using a POST request to tell the server to update information about a book with an id of '34'. Your URI might be

http://localhost/library/book/34 

Therefore, you should open a connection to localhost on port 80 (or 8080, or whatever port your server is on), and pass along an HTML request header. Going with the library example above, your request header might look as follows:

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 

From here, the server should shoot back a response header, followed by whatever the API is programed to tell the client - usually something to say the POST succeeded or failed. To stress test your API, you should essentially do this over and over again by creating a threaded process.

Also, if you are posting JSON data, you will have to alter your header and content accordingly. Frankly, if you are looking to do this quick and clean, I would suggest using python (or perl) which has several libraries for creating POST, PUT, GET and DELETE request, as well as POSTing and PUTing JSON data. Otherwise, you might end up doing more programming than stress testing. Hope this helps!

like image 113
CRK Avatar answered Sep 19 '22 09:09

CRK


Postman is the best application to test your APIs !

You can import or export your routes and let him remember all your body requests ! :)

EDIT : This comment is 5 yea's old and deprecated :D

Here's the new Postman App : https://www.postman.com/

like image 32
Luna Avatar answered Sep 21 '22 09:09

Luna