Java Language
HttpURLConnection
Sök…
Anmärkningar
Att använda HttpUrlConnection på Android kräver att du lägger till Internet-behörighet till din app (i
AndroidManifest.xml
).Det finns också andra Java HTTP-klienter och bibliotek, till exempel Square's OkHttp , som är lättare att använda och kan erbjuda bättre prestanda eller fler funktioner.
Få svarskroppen från en URL som en sträng
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();
}
Detta hämtar textdata från den angivna URL: en och returnerar den som en sträng.
Så här fungerar:
Först skapar vi en
HttpUrlConnection
från vår URL, med ennew URL(url).openConnection()
. Vi kastarUrlConnection
detta återgår till enHttpUrlConnection
, så vi har tillgång till saker som att lägga till rubriker (t.ex. User Agent) eller kontrollera svarkoden. (Det här exemplet gör inte det, men det är lätt att lägga till.)InputStream
baserat påInputStream
(för felhantering)BufferedReader
enBufferedReader
som låter oss läsa text frånInputStream
vi får från anslutningen.Nu lägger vi till en
StringBuilder
, rad för rad.Stäng
InputStream
och returnera den sträng vi nu har.
Anmärkningar:
Den här metoden kommer att kasta en
IoException
i händelse av fel (t.ex. ett nätverksfel eller ingen internetanslutning), och den kommer också att kasta en okontrolleradMalformedUrlException
om den angivna URL-adressen inte är giltig.Det kan användas för att läsa från valfri URL som returnerar text, till exempel webbsidor (HTML), REST-API: er som returnerar JSON eller XML, etc.
Användande:
Är mycket enkelt:
String text = getText(”http://example.com");
//Do something with the text from example.com, in this case the HTML.
POST-data
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();
}
}
Det här publicerar data till den angivna URL: en och läser sedan svaret rad för rad.
Hur det fungerar
- Som vanligt får vi
HttpURLConnection
från enURL
. - Ställ in innehållstyp med
setRequestProperty
, som standard är detapplication/x-www-form-urlencoded
-
setDoOutput(true)
berättar för anslutningen att vi kommer att skicka data. - Sedan får vi
OutputStream
genom att ringagetOutputStream()
och skriva data till det. Glöm inte att stänga det när du är klar. - Till sist läste vi serverns svar.
Radera resurs
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();
}
}
Detta raderar resursen i den angivna URL: en och skriver sedan ut svarhuvudet.
Hur det fungerar
- vi får
HttpURLConnection
från enURL
. - Ställ in innehållstyp med
setRequestProperty
, som standard är detapplication/x-www-form-urlencoded
-
setDoInput(true)
berättar för anslutningen att vi tänker använda URL-anslutningen för inmatning. -
setRequestMethod("DELETE")
att utföra HTTP DELETE
Till sist skriver vi ut serverns svarstitel.
Kontrollera om resursen finns
/**
* 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;
}
Förklaring:
Om du bara kontrollerar om det finns en resurs, är det bättre att använda en HEAD-begäran än en GET. Detta undviker överhead för överföring av resursen.
Observera att metoden bara returnerar true
om svarskoden är 200
. Om du förutser omdirigeringssvar (dvs. 3XX) svar, kan metoden behöva förbättras för att hedra dem.
Exempel:
checkIfResourceExists(new URL("http://images.google.com/")); // true
checkIfResourceExists(new URL("http://pictures.google.com/")); // false