Commit 0220ee96 authored by DANIEL DIAZ SANCHEZ's avatar DANIEL DIAZ SANCHEZ
Browse files

Update README.md

parent 895294e1
......@@ -4,7 +4,7 @@ Este proyecto por su sencilles NO tiene código por lo que no se puede clonar.
### Aplicaciones y librerías a utilizar
* Eclipse (podéis usar el que descargásteis el primer día)
* Eclipse (**podéis usar el que descargásteis el primer día o el instalado en las máquinas de laboratorio**)
* [Unirest](http://unirest.io/java.html): librería de peticiones HTTP (más adelante veremos como descargarla)
* [Commons](https://commons.apache.org/): librerías de funciones auxiliares (más adelante veremos como descargarla)
* [Google-Gson](https://github.com/google/gson): librería de manipulación de JSON (más adelante veremos como descargarla)
......@@ -25,7 +25,7 @@ Para realizar las peticiones vamos a usar una librería llamada UNIREST que es b
### Añadir dependencias a un proyecto
Vamos a utilizar [Maven](https://maven.apache.org/) que ya viene integrado en eclipse para trabajar con las dependencias (librerías que usará nuestro programa). Si no usáramos maven tendríamos que añadir las librerías manualmente.
Por ejemeplo, para usar esta librería (Unirest) sería necesario bajarse un zip con la librería (ficheros jar) y las dependencias que dicha librería tenga. Más tarde habría que añadirlas manualmente añadiendo los jars (indicando la localización en el disco duro) en la pantalla de gestión de las dependencias ((Build Path> Configure Build Path pestaña Libraries):
Por ejemeplo, para usar esta librería (Unirest) sería necesario bajarse un zip con la librería (ficheros jar) y las dependencias que dicha librería tenga. Más tarde habría que añadirlas manualmente añadiendo los jars (indicando la localización en el disco duro) en la pantalla de gestión de las dependencias ((Build Path> Configure Build Path pestaña Libraries) aunque lo vamos a hacer con maven que es más sencillo (la siguiente imagen es únicamente para tu información):
<img src="https://gitlab.pervasive.it.uc3m.es/distributed-computing-assignements/1-restAPIs-unirest-json/raw/master/img/image005.png" width="500px"/>
......@@ -39,13 +39,15 @@ Para saber qué dependencia añadir lo más sencillo es buscar en la página de
Editamos el fichero pom.xml del proyecto añadiendo el texto después de build:
```xml
<dependencies>
<dependency>
<groupId>com.mashape.unirest</groupId>
<artifactId>unirest-java</artifactId>
<version>1.4.9</version>
</dependency>
</dependencies>
</build>
<dependencies>
<dependency>
<groupId>com.konghq</groupId>
<artifactId>unirest-java</artifactId>
<version>3.11.02</version>
</dependency>
</dependencies>
</project>
```
quedando así (se muestra solo el final del fichero):
......@@ -56,19 +58,18 @@ quedando así (se muestra solo el final del fichero):
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<release>11</release>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>com.mashape.unirest</groupId>
<groupId>com.konghq</groupId>
<artifactId>unirest-java</artifactId>
<version>1.4.9</version>
<version>3.11.02</version>
</dependency>
</dependencies>
</project>
......@@ -81,168 +82,84 @@ Si alguna vez no encontramos alguna librería, se puede buscar en maven central
### Analizar las peticiones HTTP a una aplicación
Usaremos como ejemplo la aplicación [4-app-engine-servlet-api-search](https://gitlab.pervasive.it.uc3m.es/distributed-computing-assignements/4-app-engine-servlet-api-search) que hicimos el otro día.
Usaremos como ejemplo la aplicación de voto que hicimos el otro día o cualquier otra web.
Vamos a analizar dicha aplicación desde el punto de vista de las peticiones que le hacemos. Sabemos que nuestra aplicación nos muestra un interfaz de usuario amigable en la página http://localhost:8888/shareSomething.jsp y que cuando ponemos un texto en la búsqueda y pulsamos el botón "Search it!" o bien escribimos algo en la caja de texto de abajo y pulsamos "send it!" se generan peticiones HTTP POST a la dirección http://localhost:888/shareSomething donde se encuentra el servlet.
En el caso de nuestra aplicación, podemos preguntar a las urls:
Nuestra aplicación es algo rudimentaria, y no dispone de un interfaz rest claramente definido, pero de momento, nos vale para el propósito de comenzar con la librería.
Vamos a analizar dicha aplicación desde el punto de vista de las peticiones que le hacemos. Sabemos que nuestra aplicación nos muestra un interfaz de usuario amigable en la página http://localhost:8888/vote.jsp.
Si analizamos las peticiones, encontramos lo siguiente.
* Para compartir algo (botón send it!), tras escribir, por ejemplo "prueba" en la caja de texto y pulsar el botón "send it", se genera la siguiente petición HTTP:
* Para votar, recordamos que tenemos que hacer un POST a http://localhost:8080/vote, en el que mandamos los parámetros:
```
POST /shareSomething HTTP/1.1
Host: localhost:8888
Connection: keep-alive
Content-Length: 77
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.104 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Referer: http://192.168.1.8:8888/shareSomething
Accept-Encoding: gzip,deflate
Accept-Language: en-US,en;q=0.8,es;q=0.6
searchText=&something=prueba&username=anonymousUser192.168.1.6&POST=Send+it%21
```
Para realizar esta petición correctamente sólo tenemos que usar las cabeceras HTTP `Host`, e incluir el cuerpo.
En el cuerpo `searchText=&something=prueba&username=anonymousUser192.168.1.6&POST=Send+it%21`, podemos ver que, además de los parámetros normales de la aplicación, incluye el texto a compartir `something=prueba` . Por lo que la petición, simplificada (*lo demás lo añade el navegador*) sería:
POST /vote HTTP/1.1
host: localhost:8080
Content-Length: 34
vote=1&username=test%40example.com
```
POST /shareSomething HTTP/1.1
Host: localhost:8888
Content-Length: 77
Content-Type: application/x-www-form-urlencoded
searchText=&something=prueba&username=anonymousUser192.168.1.6&POST=Send+it%21
```
* Para buscar algo (botón Search it!), tras escribir, por ejemplo "texto búsqueda" y pulsar el botón, se genera la siguiente petición:
```
POST /shareSomething HTTP/1.1
Host: localhost:8888
Connection: keep-alive
Content-Length: 95
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.104 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Referer: http://localhost:8888/shareSomething
Accept-Encoding: gzip,deflate
Accept-Language: en-US,en;q=0.8,es;q=0.6
searchText=texto+b%C3%BAsqueda&SEARCH=Search+it%21&something=&username=anonymousUser192.168.1.6
```
* Que simplificada sería:
```
POST /shareSomething HTTP/1.1
Host: localhost:8888
Content-Length: 95
Content-Type: application/x-www-form-urlencoded
searchText=texto+b%C3%BAsqueda&SEARCH=Search+it%21&something=&username=anonymousUser192.168.1.6
```
* Al enviar esta petición, obtendremos un código de redirección 302 que nos redirigirá de nuevo a la url http://localhost:8080/vote.jsp
Y se contabilizará el voto. Podéis ver este funcionamiento con las herramientas de desarrollador de chrome o de firefox.
### Realizar peticiones HTTP
### Realizar peticiones HTTP con Unirest
Vamos a utilizar UniRest debido a que es sencilla de usar, fácil de entender, y además gestiona la concurrencia y los hilos por nosotros. Hay otras alternativas, pero esta es muy intuitiva.
En el proyecto que hemos creado para esta prácica, añadimos una clase llamada `RequestSomething.java` dentro del paquete anteriormente creado (`CdistRest` o el que hayáis elegido).
En el proyecto que hemos creado para esta prácica, añadimos una clase llamada `MyRequest.java` dentro del paquete anteriormente creado (`CdistRest` o el que hayáis elegido).
Utiliza el siguiente código:
```java
package cdistRest;
import java.io.IOException;
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;
import com.mashape.unirest.http.exceptions.UnirestException;
import com.mashape.unirest.request.GetRequest;
import com.mashape.unirest.request.body.MultipartBody;
public class RequestSomething {
public static void main(String args[])
{
try {
/* solicitamos la página donde está el JSP */
// localhost:8888/shareSomething.jsp
// declaramos una variable para la respuesta
HttpResponse<String> stringResponse = null;
// declaramos una petición tipo get
GetRequest getReq = null;
// construimos la petición
getReq = Unirest.get("http:// localhost:8888/shareSomething.jsp")
// si tuviera algún campo /shareSomething.jsp?param=value
//.field("param", "value")
.header("host", " localhost:8888");
System.out.println("Request to: " + getReq.getUrl());
// obtenermos la respuesta
stringResponse = getReq.asString();
// imprimimos el resultado
System.out.println("Result : " + stringResponse.getBody().toString());
/* hacemos varios POSTs al servlet (no al JSP) para publicar */
// declaramos una variable para la respuesta
HttpResponse<String> stringResponseToPost = null;
// declaramos una petición tipo POST
MultipartBody postReq = null;
String somethings[] = {"Primera cosa para publicar", "Segunda cosa para publicar", "Tercera cosa para publicar"};
for(String something: somethings)
{
postReq = Unirest.post("http://localhost:8888/shareSomething")
.field("searchText", "")
.field("something", something)
.field("username", "anonymouslocalhost")
.field("POST","Send it!");
// obtenermos la respuesta
stringResponse = postReq.asString();
}
/* hacemos varios POSTs al servlet (no al JSP) para buscar */
String busquedas[] = {"cosa", "para", "publicar"};
for(String busqueda: busquedas)
{
postReq = Unirest.post("http://localhost:8888/shareSomething")
.field("searchText", busqueda )
.field("SEARCH","Search it!")
.field("something", "")
.field("username", "anonymouslocalhost");
// obtenermos la respuesta
stringResponse = postReq.asString();
}
Unirest.shutdown();
} catch (UnirestException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
package CdistRest;
import kong.unirest.HttpResponse;
import kong.unirest.Unirest;
public class MyRequest {
public static void main(String args[]) {
System.out.println("Test sending post to http://localhost:8080/vote");
HttpResponse<String> res = Unirest.post("http://localhost:8080/vote").field("vote", "1")
.field("username", "test@example").asString();
System.out.println(res.getBody());
}
}
```
Para probarlo, primerlo ejecuta la aplicación web, verifica que funciona con un navegador. Luego haz debug con el programa recién creado y observa como funciona.
En java 11 os pedirá que añadáis las dependencias al fichero `module-info.java` que quedará así:
```
module CdistRest {
requires unirest.java;
}
```
Nota que el cuerpo del mensaje no se mostrará salvo error, es decir, la línea `System.out.println(res.getBody());` no tiene efecto dado que la página `/vote` no responde con nada, simplemente hace una redirección a `/vote.jsp`
Para probarlo, primerlo ejecuta la aplicación web, verifica que funciona con un navegador. Luego haz debug (ehecutar con debug en java) con el programa recién creado y observa como funciona.
**Verás que se ha contabilizado el voto**.
## Multiples peticiones
Podemos realizar múltiples peticiones con un bucle. En el caso que veremos ahora, cada petición se resolverá antes de que comience la siguiente, es decir, son secuenciales.
Para ello usaremos una clase nueva llamada `MyRequest_sequential.java` con el código:
## Formato JSON
En la prueba anterior hemos realizado peticiones en un formato específico de la aplicación. En la vida real no se hace así, suele usarse JSON.
La información que obtenemos como respuesta a las peticiones que hacemos a nuestra aplicación es HTML, que es bastante complicado de interpretar de forma automática. De hecho, HTML está destinado a presentar información más que a comunicar información estructurada entre máquinas, por eso decimos que nuestra aplicación es rudimentaria (ya la evolucionaremos más adelante).
Uno de los formatos más comunes para intercambiar información es JSON. Aquí tenéis un ejemplo de una información codificada en JSON:
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment