Java Language
HttpURLConnection
サーチ…
備考
AndroidでHttpUrlConnectionを使用するには、
AndroidManifest.xml
内のアプリにインターネットアクセス許可を追加する必要があります。SquareのOkHttpなど、他のJava HTTPクライアントとライブラリも使いやすく、より優れたパフォーマンスや機能を提供することができます。
レスポンス本文をURLからStringとして取得する
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();
}
これにより、指定されたURLからテキストデータがダウンロードされ、Stringとして返されます。
この仕組み:
まず、
new URL(url).openConnection()
を使用して、URLからHttpUrlConnection
を作成します。UrlConnection
をキャストしてUrlConnection
返すので、ヘッダー(User Agentなど)の追加やレスポンスコードの確認などのHttpUrlConnection
にアクセスできます。 (この例ではそうしませんが、追加は簡単です)。次に、レスポンスコードに基づいて
InputStream
作成します(エラー処理用)次に、接続から取得した
InputStream
からテキストを読み取ることができるBufferedReader
を作成します。今度は、テキストを行
StringBuilder
追加します。InputStream
閉じ、現在持っている文字列を返します。
ノート:
このメソッドは、障害(ネットワークエラーやインターネット接続など)が発生した場合に
IoException
をスローし、IoException
されたURLが有効でない場合はチェックされていないMalformedUrlException
もスローします。これは、Webページ(HTML)、JSONやXMLを返すREST APIなど、テキストを返す任意のURLから読み取るために使用できます。
関連項目: 数行のJavaコードでURLをStringに読み込みます 。
使用法:
非常に簡単です:
String text = getText(”http://example.com");
//Do something with the text from example.com, in this case the HTML.
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();
}
}
これにより、指定されたURLにPOSTデータが送信され、応答が1行ずつ読み込まれます。
使い方
- 通常どおり、
URL
からHttpURLConnection
を取得しURL
。 -
setRequestProperty
を使用してコンテンツタイプを設定しsetRequestProperty
。デフォルトではapplication/x-www-form-urlencoded
-
setDoOutput(true)
は、データを送信することを接続に通知します。 - 次に、
getOutputStream()
を呼び出してOutputStream
を取得し、それにデータを書き込みます。完了後にそれを閉じることを忘れないでください。 - 最後に、サーバーの応答を読みました。
リソースを削除する
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();
}
}
これにより、指定されたURLのリソースが削除され、レスポンスヘッダーが出力されます。
使い方
-
URL
からHttpURLConnection
を取得しURL
。 -
setRequestProperty
を使用してコンテンツタイプを設定しsetRequestProperty
。デフォルトではapplication/x-www-form-urlencoded
-
setDoInput(true)
は、入力にURL接続を使用することを接続に指示します。 - HTTP DELETEを実行するための
setRequestMethod("DELETE")
最後に、サーバーレスポンスヘッダーを出力します。
リソースが存在するかどうかを確認する
/**
* 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;
}
説明:
リソースが存在するかどうかだけを確認している場合は、GETよりもHEADリクエストを使用する方がよいでしょう。これにより、リソースを転送するオーバーヘッドが回避されます。
レスポンスコードが200
場合にのみ、このメソッドはtrue
返しtrue
。リダイレクト(つまり3XX)の応答を期待している場合、そのメソッドを拡張する必要があります。
例:
checkIfResourceExists(new URL("http://images.google.com/")); // true
checkIfResourceExists(new URL("http://pictures.google.com/")); // false