http-post - httpbody - urlrequest post
¿Cómo simular la solicitud POST? (5)
Estoy probando en Windows, intentando simular solicitudes POST (con diferentes variables de formulario) para pruebas de carga. He intentado todo tipo de software de prueba de carga pero no pude hacerlo funcionar.
Para las solicitudes GET, sé que puedo poner parámetros detrás de la url
http://www.example.com?id=yyy&t=zzz
Pero, ¿cómo simulo una solicitud POST?
Tengo un cliente REST de Chrome, pero no sé qué poner en los encabezados y los datos.
Esto es lo que he intentado hasta ahora:
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();
}
}
¡Postman es la mejor aplicación para probar tus APIs!
¡Puedes importar o exportar tus rutas y dejar que recuerde todas las solicitudes de tu cuerpo! :)
https://chrome.google.com/webstore/detail/postman-rest-client-packa/fhbjgbiflinjbdggehcddcbncdddomop
Esto debería ayudar si necesitas un sitio web expuesto públicamente pero estás en una PC dev. También para responder (todavía no puedo comentar): "¿Cómo publico en un servidor de desarrollo que solo se ejecuta de forma interna con esto? - stryba"
NGROK crea una URL pública segura para un servidor web local en su máquina de desarrollo (las URL permanentes están disponibles por una tarifa, temporalmente de forma gratuita).
1) Ejecute ngrok.exe para abrir la línea de comandos (en el escritorio)
2) Escriba ngrok.exe http 80 para iniciar un túnel,
3) haga una prueba explorando la dirección web que se muestra, la cual reenviará y mostrará la página 80 local predeterminada en su computadora dev.
Luego, use algunas de las herramientas recomendadas anteriormente para POST en su sitio ngrok ('' https://xxxxxx.ngrok.io '') para probar su código local.
La forma más sencilla es usar curl
desde la línea de comandos, por ejemplo:
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
o aquí hay un ejemplo de cómo enviar una solicitud POST sin procesar utilizando el shell Bash (solicitud 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
No olvide agregar el agente de usuario ya que algunos servidores bloquearán la solicitud si no hay un agente de servidor ... (obtendría una respuesta de recursos prohibidos) ejemplo:
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
Sería útil si proporcionara más información, por ejemplo, qué sistema operativo está usando, qué quiere lograr, etc. Pero, en general, cURL es una herramienta de línea de comandos muy poderosa que uso con frecuencia (en linux) para imitar solicitudes de HTML:
Por ejemplo:
curl --data "post1=value1&post2=value2&etc=valetc" http://host/resource
O, para una API RESTful:
curl -X POST -d @file http://host/resource
Puede consultar más información aquí-> http://curl.haxx.se/
EDICIONES:
DE ACUERDO. ¿Así que, básicamente, estás tratando de poner a prueba tu servidor REST? Entonces, cURL realmente no es útil a menos que desee escribir su propio programa de prueba de carga, incluso entonces los sockets serían el camino a seguir. Le sugiero que eche un vistazo a Gatling . La documentación de Gatling explica cómo configurar la herramienta, y desde allí puede ejecutar todo tipo de solicitudes GET, POST, PUT y DELETE.
Desafortunadamente, al no tener que escribir su propio programa (es decir, generar una gran cantidad de subprocesos e inundar su servidor REST con diferentes tipos de solicitudes), realmente tiene que confiar en un conjunto de herramientas de prueba de carga / estrés. El solo uso de un cliente REST para enviar solicitudes no va a poner mucho estrés en su servidor.
Más ediciones
Por lo tanto, para simular una solicitud posterior en un socket, básicamente debe crear la conexión de socket inicial con el servidor. No soy un chico de C #, así que no puedo decirte exactamente cómo hacerlo; Estoy seguro de que hay 1001 tutoriales C # socket en la web. Con la mayoría de las API REST, por lo general, debe proporcionar un URI para decirle al servidor qué debe hacer. Por ejemplo, supongamos que su API administra una biblioteca y está utilizando una solicitud POST para decirle al servidor que actualice la información sobre un libro con un ID de ''34''. Su URI podría ser
http://localhost/library/book/34
Por lo tanto, debe abrir una conexión a localhost en el puerto 80 (u 8080, o en cualquier puerto en el que se encuentre su servidor), y pasar un encabezado de solicitud HTML. Siguiendo con el ejemplo de la biblioteca anterior, el encabezado de su solicitud puede tener el siguiente aspecto:
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
Desde aquí, el servidor debe disparar un encabezado de respuesta, seguido de lo que sea que la API esté programada para decirle al cliente, por lo general algo que diga que la POST se realizó correctamente o no. Para someter a prueba tu API, debes hacer esto una y otra vez creando un proceso de subprocesos.
Además, si está publicando datos JSON, deberá modificar su encabezado y contenido en consecuencia. Francamente, si está buscando hacer esto de manera rápida y limpia, sugeriría usar python (o perl) que tiene varias bibliotecas para crear solicitudes POST, PUT, GET y DELETE, así como datos POSTing y PUTing JSON. De lo contrario, podría terminar haciendo más programación que pruebas de estrés. ¡Espero que esto ayude!