Android/HttpRequest通信/HttpURLConnection
提供: 初心者エンジニアの簡易メモ
準備
AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET" />
サンプル
同期処理のみ(AsyncTaskなどで実行すること)
get
CustomHttpURLConnection http = new CustomHttpURLConnection();
HashMap<String, String> params = new HashMap<String, String>();
params.put("errorlog", stackTrace);
http.setParams(params);
http.execGet("https://api.github.com/feeds");
post
CustomHttpURLConnection http = new CustomHttpURLConnection();
HashMap<String, String> params = new HashMap<String, String>();
params.put("errorlog", stackTrace);
http.setParams(params);
http.execPost("https://api.github.com/feeds");
CustomHttpURLConnection.java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.SocketTimeoutException;
import java.net.URL;
import android.util.Log;
class CustomHttpURLConnection
{
HttpURLConnection urlConn = null;
HashMap<String,String> mParams;
public void setParams(HashMap<String,String> params) {
mParams = params;
}
public void execGet(String strUrl) {
// System.setProperty("http.agent", "Dalvik/2.1.0 (Linux; U; Android 9; H8216 Build/PDP-PKQ1.180708.001-10229)"); // System.getProperty("http.agent");
Log.i("HttpURLConnection", "ua=" + System.getProperty("http.agent"));
InputStream in = null;
BufferedReader reader = null;
try {
if (mParams.size() > 0) {
Uri.Builder builder = new Uri.Builder();
Set keys = mParams.keySet();
for (Object key : keys) {
builder.appendQueryParameter((String) key, mParams.get((String) key));
}
String join = builder.build().getEncodedQuery();
Log.i("HttpURLConnection", "join=" + join);
strUrl = strUrl + "?" + join;
}
Log.i("HttpURLConnection", "url=" + strUrl);
URL url = new URL(strUrl);
urlConn = (HttpURLConnection) url.openConnection();
urlConn.addRequestProperty("Content-Type", "application/json; charset=UTF-8");
urlConn.setRequestMethod("GET");
urlConn.setConnectTimeout(10000); // 10s
urlConn.setReadTimeout(1000); // 1s
urlConn.connect();
int status = urlConn.getResponseCode();
Log.i("HttpURLConnection", "status_code=" + status);
if (status == HttpURLConnection.HTTP_OK) {
in = urlConn.getInputStream();
reader = new BufferedReader(new InputStreamReader(in));
StringBuilder output = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
output.append(line);
}
Log.i("HttpURLConnection", "res=" + output.toString());
}
} catch (SocketTimeoutException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (reader != null) {
reader.close();
}
if (urlConn != null) {
urlConn.disconnect();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void execPost(String strUrl) {
// System.setProperty("http.agent", "Dalvik/2.1.0 (Linux; U; Android 9; H8216 Build/PDP-PKQ1.180708.001-10229)"); // System.getProperty("http.agent");
Log.i("HttpURLConnection", "ua=" + System.getProperty("http.agent"));
HttpURLConnection urlConn = null;
InputStream in = null;
BufferedReader reader = null;
try {
URL url = new URL(strUrl);
urlConn = (HttpURLConnection) url.openConnection();
urlConn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
urlConn.setRequestMethod("POST");
urlConn.setConnectTimeout(10000); // 10s
urlConn.setReadTimeout(1000); // 1s
urlConn.setInstanceFollowRedirects(false);
urlConn.setRequestProperty("Accept-Language", "jp");
urlConn.setDoOutput(true);
OutputStream outputStream = urlConn.getOutputStream();
Log.i("HttpURLConnection", "mParams.size()=" + mParams.size());
if (mParams.size() > 0) {
Uri.Builder builder = new Uri.Builder();
Set keys = mParams.keySet();
for (Object key : keys) {
builder.appendQueryParameter((String) key, mParams.get((String) key));
}
String join = builder.build().getEncodedQuery();
Log.i("HttpURLConnection", "join=" + join);
PrintWriter ps = new PrintWriter(outputStream);
ps.print(join);
ps.close();
}
outputStream.close();
int status = urlConn.getResponseCode();
String resmessage = urlConn.getResponseMessage();
Log.i("HttpURLConnection", "status_code=" + status);
Log.i("HttpURLConnection", "message=" + resmessage);
if (status == HttpURLConnection.HTTP_OK) {
in = urlConn.getInputStream();
reader = new BufferedReader(new InputStreamReader(in));
StringBuilder output = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
output.append(line);
}
Log.i("HttpURLConnection", "res=" + output.toString());
}
} catch (SocketTimeoutException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (reader != null) {
reader.close();
}
if (urlConn != null) {
urlConn.disconnect();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
urlConn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); はjsonでなくpost時はこんな感じにしないとならない。
uaはサーバに接続して変更設定されていることを確認済み。
ドメイン接続許可しないエラーが出るときはこちらを確認
android/開発環境/Android8 [ショートカット]
参考
https://itsakura.com/java-httpurlconnection
http://d.hatena.ne.jp/Kazuhira/20131026/1382796711
uaを設定しない場合とwebviewからもてっくる場合
HttpURLConnectionのuaデフォ(System.getProperty("http.agent");)
Dalvik/2.1.0 (Linux; U; Android 9; Pixel 2 XL Build/PPR2.181005.003)
webviewのua android/webview/useragent [ショートカット]
Mozilla/5.0 (Linux; Android 9; Pixel 2 XL Build/PPR2.181005.003; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/70.0.3538.110 Mobile Safari/537.36
retry処理
本来のget処理をexecGetCore()に入れる
public boolean execGet() throws Exception {
Exception tmpException = null;
for (int retry = 0; retry <= mRetry; retry++) {
try {
boolean ret = execGetCore();
if (ret) {
return ret;
}
} catch (Exception e) {
tmpException = e;
}
}
if (Exception != null) {
throw tmpException;
}
return false;
}
async経由
import android.app.Activity;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.os.AsyncTask;
import android.util.Log;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
/*
HttpAsyncTask task = new HttpAsyncTask();
task.setParam1("hoge");
*/
public class HttpAsyncTask extends AsyncTask<String, Integer, Long>
implements OnCancelListener {
private final String TAG = "MyAsyncTask";
private Context mContext;
private Activity mActivity;
private String param1;
public HttpAsyncTask(Context context) {
this.mContext = context;
}
public void setActivity(Activity activity) {
mActivity = activity;
}
public void setParam1(String str) {
this.param1 = str;
}
@Override
protected void onPreExecute() {
Log.d(TAG, "onPreExecute");
}
@Override
protected Long doInBackground(String... urls) {
CustomHttpURLConnection http = new CustomHttpURLConnection();
try {
String encode = URLEncoder.encode(param1, "UTF-8");
String url = "ttps://hoge.example.com/hoge?param1=" + encode;
http.execGet(url);
Log.d(TAG, url);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return 123L;
}
@Override
protected void onProgressUpdate(Integer... values) {
Log.d(TAG, "onProgressUpdate=" + values[0]);
}
@Override
protected void onCancelled() {
Log.d(TAG, "onCancelled");
}
@Override
protected void onPostExecute(Long result) {
Log.d(TAG, "onPostExecute=" + result);
}
public void onCancel(DialogInterface dialog) {
Log.d(TAG, "Dialog onCancell... calling cancel(true)");
this.cancel(true);
}
}
