Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

HTTP Request Java: metodi, uso ed esempi

Analizziamo come vedere e come interagire direttamente con le request e le response header legate al protocollo HTTP.
Analizziamo come vedere e come interagire direttamente con le request e le response header legate al protocollo HTTP.
Link copiato negli appunti

Quando si scrivono applicazioni web, basate su Servlet o pagine JSP, solitamente le servlet API si occupano direttamente dell'interazione con il protocollo HTTP, sollevando il programmatore da tali questioni.

Tuttavia, può sorgere la necessità di interagire direttamente con le request e le response header legate al medesimo protocollo HTTP e in tal caso, sarà necessario avvalersi direttamente delle servlet API.

Rinfreschiamo la memoria esaminando come sono strutturati gli oggetti request e response dell'Hyper Text Transfer Protocol:

HTTP request

Vediamo un esempio di HTTP request, utilizzando la richiesta effettuata tramite un browser Internet Explorer, all'indirizzo www.html.it:

GET / HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/msword, application/vnd.ms-excel, */*
Accept-Language: it
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
Host: www.html.it
Connection: Keep-Alive
Cookie: __utma=151439968.604684092.1165355506.1165355506.1165357918.2; __utmz=151439968.1165357918.2.2.utmccn=(organic)|utmcsr=google|utmctr=%2Beclipse+%2B%22web+editor%22|utmcmd=organic

La prima riga della request (request line) contiene il metodo utilizzato per la richiesta (nel nostro esempio GET), la URL associata alla richiesta stessa e la versione del protocollo HTTP utilizzata (nel nostro esempio: HTTP/1.1)

Dopo la request line, vediamo una serie di request header che forniscono informazioni sul browser e sulla richiesta specifica.

Nel nostro esempio, sono contenute sette request header anche se il numero di header, in generale, può essere variabile. Ogni request header inizia sempre con il nome della request header stessa (per es.: User-Agent), seguito dal carattere ":", da uno spazio e, infine, dal valore associato all'header.

Tipi di Header Request HTTP

Le request header più usate sono le seguenti:

  • Accept: specifica l'ordine preferito dal browser relativamente ai MIME types supportati. La stringa "*/*" indica che il browser è in grado di gestire qualunque tipologia di MIME type.
  • Accept-Encoding: specifica le tipologie di compressioni accettate dal browser
  • Accept-Charset: specifica l'insieme di caratteri che il browser può accettare.
  • Accept-Language: serve a specificare i codici dei linguaggi standard che il browser preferisce ricevere.
  • Authorization: identifica il livello di autorizzazione per il browser. Quando si utilizza la sicurezza gestita dal container, il servlet container si occupa di impostare questo header in modo automatico.
  • Connection: indica il tipo di connessione che viene utilizzata dal browser. Nella versione 1.1 del protocollo HTTP tale valore è valorizzato con la stringa "Keep-Alive".
  • Cookie: specifica i valori di eventuali cookie inviati dal server nelle precedenti comunicazioni con il browser.
  • Host: contiene informazioni sull'host e la porta
  • Referer: la url della pagina web cui si fa riferimento. Si noti, per curiosità, l'errore ortografico (la parola corretta sarebbe Referrer) commesso da uno degli autori del protocollo HTTP che si decise di non correggere nelle versioni successive.
  • User-agent: indica il tipo di browser. Sia Internet Explorer che Netscape Navigator si identificano come "Mozilla" ma il primo include anche la stringa "MSIE"

HTTP response

Prendiamo come esempio la HTTP response relativa alla richiesta al sito www.html.it, fatta in precedenza:

HTTP/1.0 200 OK
Date: Sun, 11 Mar 2007 15:38:49 GMT
Server: Apache
Cache-Control: no-store, no-cache, must-revalidate
Expires: Fri, 15 Aug 1976 18:15:00 GMT
X-Powered-By: PHP/4.3.10-18
Pragma: no-cache
Last-Modified: Sun, 11 Mar 2007 15:38:49 GMT
Cache-Control: post-check=0, pre-check=0
Content-Encoding: gzip
Connection: close
Content-Type: text/html; charset=iso-8859-1

La prima riga, di una response HTTP, viene chiamata status line. In essa vengono specificate:

  • La versione del protocollo HTTP che si sta utilizzando
  • Un codice definito status code (nel nostro caso valorizzato con 200)
  • Un messaggio associato allo status code ("OK").

Dopo la status line, sono presenti le response header, contenenti delle informazioni sul server e sulla risposta che si sta inviando al client.

Ogni response header inizia con il nome dell'header seguito dal carattere ":", uno spazio e il valore associato all'header.

L'HTTP response, al termine dell'ultima response header, ha una riga vuota seguita dal cosiddetto response body che, tipicamente, è il contenuto HTML del documento.

Le response header più comunemente utilizzate sono le seguenti:

  • cache-control: controlla la modalità di caching per una pagina web
  • content-disposition: può essere utilizzato per specificare un file binario in allegato alla response
  • content-length: specifica la lunghezza del body della response, espresso in byte
  • content-type: specifica il MIME type del documento di risposta
  • content-encoding: specifica il tipo di codifica utilizzato nella risposta. Spesso, utilizzare una codifica di tipo GZIP incrementa notevolmente le performance
  • expires: specifica la durata della cache
  • last-modified: indica, in termini temporali, l'ultimo aggiornamento effettuato su una pagina
  • pragma: disabilita la cache sui vecchi browser attraverso l'utilizzo della stringa "no-cache"
  • refresh: specifica il numero di secondi trascorsi i quali il browser deve richiedere un aggiornamento della pagina

Per maggiori dettagli sulle request e sulle response header si rimanda alla RFC specifica (2616).

Come interagire con la request

Vediamo adesso come utilizzare i metodi delle servlet API per interagire con i dati contenuti in una request HTTP.

E' possibile avvalersi dei seguenti metodi dell'interfaccia HttpServletRequest (appartenente al package javax.servlet.http) per ricavare il valore delle request header presenti nella richiesta:

  • String getHeader(String headerName)
  • int getIntHeader(String headerName)
  • Date getDateHeader(String headerName)
  • Enumeration getHeaderNames()

Il metodo getHeader restituisce il valore associato a un qualsiasi header, il cui nome viene passato come parametro in input.

I metodi getIntHeader e getDateHeader semplificano l'interazione con i request header che contengono valori interi o di tipo data.

Il metodo getHeaderNames restituisce un oggetto di tipo Enumeration che contiene i nomi di tutti gli header presenti nella richiesta.

Sono definiti, inoltre, dei metodi che consentono di ricavare i request header in maniera ancora più semplice e diretta. Essi sono:

  • String getContentType()
  • int getContentLength()
  • Cookie[] getCookies()
  • String getAuthType()
  • String getRemoteUser()

In pratica, le due istruzioni seguenti sono assolutamente equivalenti:

int contentLength = request.getIntHeader("Content-Length");
Int contentLength = request.getContentLength();

Uno dei vantaggi che derivano dall'interazione con le request header è, per esempio, quello di poter eseguire delle operazioni differenti in base al tipo di browser utilizzato, come mostrato nelle seguenti righe di codice:

Listato 1. esegue due azioni diverse in base al browser

String browser = request.getHeader ("User-Agent");
if (browser.indexOf("MSIE") > -1)
executeIEActions(); // esegue le azioni necessarie per Internet Explorer
else
executeNetscapeActions(); // esegue le azioni necessarie per Netscape

Una pagina JSP che mostra le header di richiesta

Una semplice e interessante applicazione di esempio potrebbe essere quella di scrivere una pagina JSP che visualizzi tutte le request header presenti nella richiesta proveniente da un client (avvalendosi dei metodi getHeaderNames e getHeader) e confronta il risultato ottenuto effettuando la stessa richiesta con due browser differenti.

Scriviamo, dunque, la seguente pagina JSP:

Listato 2. Restituisce una risposta diversa in base al browser (Guarda il codice completo)

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
    //..
<%@page import="java.util.*" %>
<%
Enumeration headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements())
{
String nome = (String) headerNames.nextElement();
String valore = request.getHeader(nome);
%>
<tr>
<td align="right"><%= nome %></td>
<td><%= valore %></td>
</tr>
<%
}
%>
..//

Effettuiamo il deployment dell'applicazione (per esempio su Tomcat) e carichiamo, quindi, la nostra pagina JSP prima usando Internet Explorer 6.0:

Figura 1. Request header utilizzate dalla richiesta effettuata tramite Internet Explorer
Request header utilizzate dalla richiesta effettuata tramite Internet Explorer

Poi utilizzando Mozilla FireFox 2.0:

Figura 2. Request header utilizzati dalla richiesta effettuata tramite FireFox Mozilla
Request header utilizzati dalla richiesta effettuata tramite FireFox Mozilla

Come si può notare, la richiesta HTTP effettuata tramite Mozilla contiene un numero maggiore di header. Inoltre, è interessante far caso alle tipologie differenti di file che vengono specificati in Mozilla (nell'header accept) diversamente da Internet Explorer che non dichiara, in tal senso, particolari preferenze.

Come interagire con la response

Analogamente a quanto visto per la request è possibile impostare le response header attraverso l'utilizzo di opportuni metodi messi a disposizione dall'interfaccia HttpServletResponse del package javax.servlet.http.

I più generali, in linea con quanto osservato precedentemente per l'oggetto request, sono:

  • void setHeader(String headerName, String headerValue)
  • void setIntHeader (String headerName, int headerValue)
  • void setDateHeader(String headerName, long headerValue)

Il primo consente di impostare il valore di qualsiasi header mentre gli altri due consentono di ottenere lo stesso risultato con gli header che richiedono un valore intero o di tipo data.

Anche nel caso della response è possibile utilizzare dei metodi diretti per l'impostazione del valore degli header, per esempio, utilizzando i seguenti metodi:

  • void setContentType(String mimeType)
  • void setContentLength (int lengthInBytes)
  • void addCookie(Cookie cookie)

Infine, da segnalare anche il seguente metodo che consente di impostare il codice di ritorno della response sulla status line:

void setStatus(int sc)

Per esempio, la seguente linea di codice:

response.setStatus(HttpServletResponse.SC_BAD_REQUEST)

indicherà al browser un risultato di richiesta sintatticamente non corretta (codice 404).

Ti consigliamo anche