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 na HttpUrlConnection , 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 z InputStream 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 niesprawdzony MalformedUrlException 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 z URL .
  • Ustaw typ zawartości za pomocą setRequestProperty , domyślnie jest to application/x-www-form-urlencoded
  • setDoOutput(true) informuje połączenie, że wyślemy dane.
  • Następnie uzyskujemy OutputStream poprzez wywołanie getOutputStream() 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 z URL .
  • Ustaw typ zawartości za pomocą setRequestProperty , domyślnie jest to application/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


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow