HttpComponents - Invocazione di una Servlet da un Client Java

DOMANDA:

Posso invocare una servlet da un client Java?


RISPOSTA:

E' possibile stabilire una connessione con un endpoint attraverso le famose API del framework HttpClient. Purtroppo, come si può notare dalla seguente frase riportata nella home page ufficiale della libreria
"The Commons HttpClient project is now end of life, and is no longer being developed. It has been replaced by the Apache HttpComponents project "
HttpClient è stato sostituito da HttpComponents.

Per garantire vita lunga al nostro software, in questo post descriveremo un esempio di utilizzo proprio utilizzando la nuova libreria HttpComponents per eseguire una richiesta POST verso una Servlet.

Innanzitutto eseguiamo il download dei jar di HttpComponents dal link HttpComponents v4.3

Apriamo quindi Eclipse, creiamo un nuovo progetto Java e, prima di scrivere codice, aggiungiamo al build path i jar appena scaricati.

Creiamo la classe MyHttpClient:
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.GregorianCalendar;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;


public class MyHttpClient {
 
 private static final String PROTOCOL="http";
 private static final String HOST="localhost";
 private static final int PORT=8080;
 
 public static void main(String [] args){
  
  HttpClient httpclient = null;
  HttpPost httpPost = null;
  
  System.out.println("Preparo il metodo POST");
  URIBuilder builder = new URIBuilder();//Costruzione endpoint servlet con parametri
  builder.setScheme(PROTOCOL).setHost(HOST).setPort(PORT).setPath("/MyHttpServlet/MyServlet")
      .setParameter("name", MyHttpClient.class.getName())
      .setParameter("date", String.valueOf(GregorianCalendar.getInstance().getTimeInMillis()));
  
  try {
   URI uri = builder.build();
   httpPost = new HttpPost(uri);
   
   System.out.println("Instanzio un http client");
   httpclient = HttpClients.createDefault();

   System.out.println("Invoco la servlet: "+httpPost.getURI());
   
   HttpResponse response = httpclient.execute(httpPost);
   HttpEntity entity = response.getEntity();
   
   System.out.println("Risposta: "+EntityUtils.toString(entity));
  } catch (IOException e) {
   e.printStackTrace();
  } catch (URISyntaxException e) {
   e.printStackTrace();
  } finally {
            httpPost.releaseConnection();
        }
 }
}


La servlet MyServlet può essere realizzata in questo modo:
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/MyServlet")
public class MyServlet extends HttpServlet {
 

 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  String name = request.getParameter("name");
  System.out.println("Ricevuto: "+name);
  String dateParam = request.getParameter("date");
  
  long date = Long.parseLong(dateParam);
  
  response.setContentType("text/plain");
  PrintWriter out = response.getWriter();
  out.write("Ciao "+name+"\n");
  out.write("Richiesta ricevuta il: "+new Date(date));
  
  out.flush();
  out.close();
 }

 
 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  doGet(request, response);
 }

}

Avviando opportunamente un Servlet Container (ad esempio Tomcat) in cui verrà effettuato il "deploy" della nostra semplice servlet, il client MyHttpClient potrà invocare MyServlet in qualsiasi momento.

Infatti, dopo l'avvio, l'output di MyHttpClient sarà:
Preparo il metodo POST
Instanzio un http client
Invoco la servlet: http://localhost:8080/MyHttpServlet/MyServlet?name=MyHttpClient&date=1372361403328
Risposta: Ciao MyHttpClient
Richiesta ricevuta il: Thu Oct 03 20:10:03 CEST 2013

Mentre l'output di MyServlet sarà:
Ricevuto: MyHttpClient


Riferimenti

GitHub

Commenti

Post popolari in questo blog

Arrotondamento e troncamento in Java

Eclipse: Shortcuts (scorciatoie) da tastiera

Strutture dati: List, Set, Map

Creare un eseguibile Java