Java Language
HttpURLConnection
Ricerca…
Osservazioni
L'utilizzo di HttpUrlConnection su Android richiede l'aggiunta dell'autorizzazione Internet alla tua app (in
AndroidManifest.xml
).Esistono anche altri client e librerie Java HTTP, come OkHttp di Square, che sono più facili da usare e possono offrire prestazioni migliori o più funzionalità.
Ottieni il corpo della risposta da un URL come stringa
String getText(String url) throws IOException {
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
//add headers to the connection, or check the status if desired..
// handle error response code it occurs
int responseCode = conn.getResponseCode();
InputStream inputStream;
if (200 <= responseCode && responseCode <= 299) {
inputStream = connection.getInputStream();
} else {
inputStream = connection.getErrorStream();
}
BufferedReader in = new BufferedReader(
new InputStreamReader(
inputStream));
StringBuilder response = new StringBuilder();
String currentLine;
while ((currentLine = in.readLine()) != null)
response.append(currentLine);
in.close();
return response.toString();
}
Ciò scaricherà i dati di testo dall'URL specificato e li restituirà come una stringa.
Come funziona:
Per prima cosa, creiamo
HttpUrlConnection
dal nostro URL, con ilnew URL(url).openConnection()
. TrasmettiamoUrlConnection
per tornare aHttpUrlConnection
, così abbiamo accesso a cose come aggiungere intestazioni (come User Agent) o controllare il codice di risposta. (Questo esempio non lo fa, ma è facile da aggiungere.)Quindi, creare
InputStream
base al codice di risposta (per la gestione degli errori)Quindi, crea un
BufferedReader
che ci permette di leggere il testo daInputStream
che otteniamo dalla connessione.Ora, aggiungiamo il testo a
StringBuilder
, riga per riga.Chiudi l'
InputStream
e restituisci la stringa che ora abbiamo.
Gli appunti:
Questo metodo genererà una
IoException
diIoException
in caso di errore (ad esempio un errore di rete o nessuna connessione Internet) e genererà anche un'eccezioneMalformedUrlException
non selezionata se l'URL specificato non è valido.Può essere utilizzato per la lettura da qualsiasi URL che restituisce testo, come pagine Web (HTML), API REST che restituiscono JSON o XML, ecc.
Vedi anche: Leggi l'URL su String in poche righe di codice Java .
Uso:
È molto semplice:
String text = getText(”http://example.com");
//Do something with the text from example.com, in this case the HTML.
Dati POST
public static void post(String url, byte [] data, String contentType) throws IOException {
HttpURLConnection connection = null;
OutputStream out = null;
InputStream in = null;
try {
connection = (HttpURLConnection) new URL(url).openConnection();
connection.setRequestProperty("Content-Type", contentType);
connection.setDoOutput(true);
out = connection.getOutputStream();
out.write(data);
out.close();
in = connection.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String line = null;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
in.close();
} finally {
if (connection != null) connection.disconnect();
if (out != null) out.close();
if (in != null) in.close();
}
}
Questo invierà i dati all'URL specificato, quindi leggerà la risposta riga per riga.
Come funziona
- Come al solito otteniamo
HttpURLConnection
da unURL
. - Imposta il tipo di contenuto utilizzando
setRequestProperty
, per impostazione predefinita èapplication/x-www-form-urlencoded
-
setDoOutput(true)
indica la connessione che invieremo i dati. - Quindi otteniamo
OutputStream
chiamandogetOutputStream()
e scrivendo i dati su di esso. Non dimenticare di chiuderlo dopo aver finito. - Finalmente leggiamo la risposta del server.
Elimina risorsa
public static void delete (String urlString, String contentType) throws IOException {
HttpURLConnection connection = null;
try {
URL url = new URL(urlString);
connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.setRequestMethod("DELETE");
connection.setRequestProperty("Content-Type", contentType);
Map<String, List<String>> map = connection.getHeaderFields();
StringBuilder sb = new StringBuilder();
Iterator<Map.Entry<String, String>> iterator = responseHeader.entrySet().iterator();
while(iterator.hasNext())
{
Map.Entry<String, String> entry = iterator.next();
sb.append(entry.getKey());
sb.append('=').append('"');
sb.append(entry.getValue());
sb.append('"');
if(iterator.hasNext())
{
sb.append(',').append(' ');
}
}
System.out.println(sb.toString());
} catch (Exception e) {
e.printStackTrace();
} finally {
if (connection != null) connection.disconnect();
}
}
Questo ELIMINA la risorsa nell'URL specificato, quindi stampa l'intestazione della risposta.
Come funziona
- otteniamo
HttpURLConnection
da unURL
. - Imposta il tipo di contenuto utilizzando
setRequestProperty
, per impostazione predefinita èapplication/x-www-form-urlencoded
-
setDoInput(true)
indica alla connessione che intendiamo utilizzare la connessione URL per l'input. -
setRequestMethod("DELETE")
per eseguire il DELETE HTTP
Finalmente stampiamo l'intestazione della risposta del server.
Controlla se esiste una risorsa
/**
* Checks if a resource exists by sending a HEAD-Request.
* @param url The url of a resource which has to be checked.
* @return true if the response code is 200 OK.
*/
public static final boolean checkIfResourceExists(URL url) throws IOException {
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("HEAD");
int code = conn.getResponseCode();
conn.disconnect();
return code == 200;
}
Spiegazione:
Se stai solo controllando se esiste una risorsa, è meglio usare una richiesta HEAD piuttosto che una GET. Ciò evita il sovraccarico del trasferimento della risorsa.
Si noti che il metodo restituisce true
solo se il codice di risposta è 200
. Se si anticipano le risposte di reindirizzamento (ovvero 3XX), potrebbe essere necessario migliorare il metodo per onorarle.
Esempio:
checkIfResourceExists(new URL("http://images.google.com/")); // true
checkIfResourceExists(new URL("http://pictures.google.com/")); // false