Come fare una richiesta post passando dei parametri in java

Esistono due sistemi per fare una chiamata verso un indirizzo. Il più facile e diffuso è il metodo 'Get'. Quest'ultimo consiste nel fare una chiamata come quelle che facciamo ogni giorno centinaia di volte dal browser, ad esempio verso http://writingyourcode.blogspot.it. Se vogliamo aggiungere dei parametri li dobbiamo accodare alla url con una Query String, ovvero dobbiamo inserire il ? seguito da nome=valore, e contatenare più parametri con il carattere &.

Alla fine Assumendo di avere due parametri, user con valore pippo e pwd con valore pluto, avremo una url che assomiglierà a questa http://writingyourcode.blogspot.it?user=pippo&pwd=pluto. Lo svantaggio di usare questo metodo è che, come vedete i parametri che passiamo sono in chiaro. Se state realizzando ad esempio un form per il login o la registrazione dei vostri utenti, non è certo carino vedere i dati personali di quest'ultimi viaggiare in chiaro sulla rete. Avete bisogno di un meccanismo per 'nasconderli'. Per fare ciò esiste l'altro metodo, ovvero il 'post'. Con questo metodo la url precedente rimarrà http://writingyourcode.blogspot.it e i parametri non saranno visibili. Vediamo come realizzare un metodo in java che faccia una chiamata post passando dei parametri. Per farlo utilizziamo la libreria httpclient di Apache, che potete scaricare da qui. I dati vengono inviati e ricevuti attraverso la classe HttpClient.

  
package writingyourcode.http.test;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.params.HttpClientParams;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpParams;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;

public class HttpRequest{
   
   protected HttpClient httpClient;
 
   public String postRequestWithParams(String serviceUrl, 
            HashMap<String, String> paramMap) {
      
      String htmlResponse = "";
      HttpPost post = null;
      List<NameValuePair> params = new ArrayList<NameValuePair>();
  
      if (paramMap != null && !paramMap.isEmpty()) {
         for (Map.Entry<string string="string"> entry : paramMap.entrySet())
            params.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
      }
  
      post = new HttpPost(serviceUrl);
      try {
         UrlEncodedFormEntity sendentity = new 
         UrlEncodedFormEntity(params,HTTP.UTF_8);
         post.setEntity(sendentity);
      } catch (UnsupportedEncodingException e) {}

      HttpResponse response = null;
      HttpEntity entity = null;
      
      try {
         response = httpClient.execute(post);
         int resultCode = response.getStatusLine().getStatusCode();
         if (resultCode == 200) {
            entity = response.getEntity();
            htmlResponse = EntityUtils.toString(entity);
         } 
      } catch (Exception e) {
         logger.error("Exception connecting to url <" + serviceUrl + ">", e);
      } finally {
         //Close connection
  try {
     if (entity != null) {
        EntityUtils.consume(entity);
     } else {
        post.abort();
     }
  } catch (IOException ioe) {
     post.abort();
  } catch (Exception e) {
     post.abort();
         }
      }
      return htmlResponse;
   }
 
   public HttpClient getHttpClient() {
      return httpClient;
   }
   public void setHttpClient(HttpClient httpClient) {
      this.httpClient = httpClient;
   }
}

Il codice qui sopra è abbastanza semplice. Viene creata una lista di NameValuePair che contiene le coppie chiave valore dei parametri da inviare. Quest'ultima viene settata come Entity all'oggetto HttpPost che abbiamo creato in precedenza. Con il metodo execute della classe HttpClient eseguiamo la richiesta e restituiamo la risposta che ci viene data in caso di esito positivo. Ricordatevi infine di pulire e cancellare quello che avete usato. Un mio professore di università diceva sempre 'Se istanziate un oggetto o usate una risorsa siete voi i proprietari e quindi spetta a voi fare pulizia dopo averli usati.'

Risorse:
HttpClient
BasicNameValuePair
UrlEncodedFormEntity

0 commenti: