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:

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

Le response header più comunemente utilizzate sono le seguenti:

  • cache-control
  • content-disposition
  • content-length
  • content-type
  • content-encoding
  • expires
  • last-modified
  • pragma
  • refresh

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

I metodi getIntHeader getDateHeader

Il metodo getHeaderNames

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