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
HttpUrlConnectiondal nostro URL, con ilnew URL(url).openConnection(). TrasmettiamoUrlConnectionper 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
InputStreambase al codice di risposta (per la gestione degli errori)Quindi, crea un
BufferedReaderche ci permette di leggere il testo daInputStreamche otteniamo dalla connessione.Ora, aggiungiamo il testo a
StringBuilder, riga per riga.Chiudi l'
InputStreame restituisci la stringa che ora abbiamo.
Gli appunti:
Questo metodo genererà una
IoExceptiondiIoExceptionin caso di errore (ad esempio un errore di rete o nessuna connessione Internet) e genererà anche un'eccezioneMalformedUrlExceptionnon 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
HttpURLConnectionda 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
OutputStreamchiamandogetOutputStream()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
HttpURLConnectionda 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