Java Language
HttpURLConnection
Szukaj…
Uwagi
Korzystanie z HttpUrlConnection na Androidzie wymaga dodania uprawnień internetowych do aplikacji (w
AndroidManifest.xml
).Istnieją również inne klienty i biblioteki Java HTTP, takie jak OkHttp Square, które są łatwiejsze w użyciu i mogą oferować lepszą wydajność lub więcej funkcji.
Uzyskaj treść odpowiedzi z adresu URL jako ciąg
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();
}
Spowoduje to pobranie danych tekstowych z określonego adresu URL i zwrócenie go jako ciągu.
Jak to działa:
Najpierw tworzymy
HttpUrlConnection
z naszego adresu URL za pomocąnew URL(url).openConnection()
.UrlConnection
zwraca naHttpUrlConnection
, więc mamy dostęp do takich rzeczy, jak dodawanie nagłówków (takich jak User Agent) lub sprawdzanie kodu odpowiedzi. (Ten przykład tego nie robi, ale łatwo go dodać.)Następnie utwórz
InputStream
na podstawie kodu odpowiedzi (do obsługi błędów)Następnie utwórz
BufferedReader
który pozwala nam czytać tekst zInputStream
który otrzymujemy z połączenia.Teraz dołączamy tekst do
StringBuilder
, wiersz po wierszu.Zamknij
InputStream
i zwróć ciąg, który mamy teraz.
Uwagi:
Ta metoda zgłosi
IoException
w przypadku awarii (np. Błąd sieci lub brak połączenia z Internetem), a także zgłosi niesprawdzonyMalformedUrlException
jeśli podany adres URL jest nieprawidłowy.Można go używać do odczytu z dowolnego adresu URL, który zwraca tekst, takiego jak strony internetowe (HTML), interfejsy API REST, które zwracają JSON lub XML itp.
Zobacz także: Czytaj adres URL do ciągu w kilku wierszach kodu Java .
Stosowanie:
Jest bardzo proste:
String text = getText(”http://example.com");
//Do something with the text from example.com, in this case the HTML.
Wysłać dane
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();
}
}
Spowoduje to wysłanie danych POST do określonego adresu URL, a następnie odczytywanie odpowiedzi wiersz po wierszu.
Jak to działa
- Jak zwykle uzyskujemy
HttpURLConnection
zURL
. - Ustaw typ zawartości za pomocą
setRequestProperty
, domyślnie jest toapplication/x-www-form-urlencoded
-
setDoOutput(true)
informuje połączenie, że wyślemy dane. - Następnie uzyskujemy
OutputStream
poprzez wywołaniegetOutputStream()
i zapisanie do niego danych. Nie zapomnij go zamknąć po zakończeniu. - W końcu czytamy odpowiedź serwera.
Usuń zasób
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();
}
}
Spowoduje to usunięcie zasobu z określonego adresu URL, a następnie wydrukowanie nagłówka odpowiedzi.
Jak to działa
- uzyskujemy
HttpURLConnection
zURL
. - Ustaw typ zawartości za pomocą
setRequestProperty
, domyślnie jest toapplication/x-www-form-urlencoded
-
setDoInput(true)
informuje połączenie, że zamierzamy użyć połączenia URL do wprowadzania danych. -
setRequestMethod("DELETE")
aby wykonać HTTP DELETE
W końcu wypisujemy nagłówek odpowiedzi serwera.
Sprawdź, czy zasób istnieje
/**
* 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;
}
Wyjaśnienie:
Jeśli tylko sprawdzasz, czy zasób istnieje, lepiej użyć żądania HEAD niż GET. Pozwala to uniknąć narzutu związanego z przenoszeniem zasobu.
Zauważ, że metoda zwraca true
tylko jeśli kod odpowiedzi to 200
. Jeśli spodziewasz się odpowiedzi przekierowujących (tj. 3XX), konieczne może być ulepszenie metody, aby je uwzględnić.
Przykład:
checkIfResourceExists(new URL("http://images.google.com/")); // true
checkIfResourceExists(new URL("http://pictures.google.com/")); // false