▼ HttpAccess パッケージのダウンロード ( 解凍して、main\java フォルダの中に コピーして下さい ) ※ OkHttp より 最新の Gradle の記述を取得して build.gradle の dependencies の最後に貼り付けて下さい 例) compile 'com.squareup.okhttp3:okhttp:3.8.1' OkHttp okio 厳密に言うと、GET 時に渡す URL の QueryString 部分はクラス外部で作成するようになっています。仮にデータ部分を日本語で指定しても、UTF8 であれば自動的にエンコードしてくれます。また、set メソッドで URL の変更も可能です。 コンストラクタで渡す URL は、GET では必ず使用されますが、POST では実行時に指定した url KEY を使う事ができます(省略すると、コンストラクタ作成時の url を使用します) url に関しては、Getter と Setter があります。 ファイルアップロードは1件のみの処理を想定しています。入力データとして InputStream を使い、内部で ByteArray に変換しています。Okhttp のメソッドが InputStream には対応していないので、複数ファイルアップロードは、一度にひとつのファイルになるよう外部でコントロールが必要になるでしょう。
import android.os.AsyncTask; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.Map; import okhttp3.Call; import okhttp3.FormBody; import okhttp3.MediaType; import okhttp3.MultipartBody; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; import okio.BufferedSink; import okio.Okio; import okio.Source; public class HttpAccess { private OkHttpClient okHttpClient; private String url; public interface OnAsyncTaskListener { abstract public void onAsyncTaskListener(String s); } // url の Getter と Setter public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } // ******************************* // コンストラクタ // ******************************* public HttpAccess(String url) { this.okHttpClient = new OkHttpClient(); this.url = url; } // ******************************* // GET // ******************************* public void sendGet(final OnAsyncTaskListener listener ) { new AsyncTask<Void,Void,String>(){ @Override protected String doInBackground(Void... params) { String result = "[\"error\"]"; Request.Builder builder = new Request.Builder(); builder.url(HttpAccess.this.url); Request request = builder.build(); Response response = null; try { response = HttpAccess.this.okHttpClient.newCall(request).execute(); result = response.body().string(); } catch (IOException e) { e.printStackTrace(); } return result; } // UI スレッド処理 @Override protected void onPostExecute(String s) { super.onPostExecute(s); listener.onAsyncTaskListener(s); } }.execute(); } // ******************************* // POST // ******************************* public void sendPost(HashMap<String,String> postData, final OnAsyncTaskListener listener ) { new AsyncTask<HashMap,Void,String>(){ @Override protected String doInBackground(HashMap... params) { String result = "[\"error\"]"; HashMap<String,String> postData = (HashMap<String,String>)params[0]; // POST 用 FormBody の内容の作成 FormBody.Builder formbodyBuilder = new FormBody.Builder(); for(Map.Entry<String, String> e : postData.entrySet()) { if ( !(e.getKey()).equals("url") ) { formbodyBuilder.add(e.getKey(), e.getValue()); } } // 送信用ユニットの作成 FormBody formbody = formbodyBuilder.build(); Request.Builder builder = new Request.Builder(); // 引数の Map に url が無い場合は、コンストラクタの url を使用する if ( postData.get("url") == null ) { builder.url(HttpAccess.this.url) ; } else { builder.url( postData.get("url") ); } builder.post(formbody); Request request = builder.build(); Response response = null; try { response = HttpAccess.this.okHttpClient.newCall(request).execute(); result = response.body().string(); } catch (IOException e) { e.printStackTrace(); } return result; } // UI スレッド処理 @Override protected void onPostExecute(String s) { listener.onAsyncTaskListener(s); } }.execute(postData); } // ******************************* // 1ファイルのアップロード( Byte 配列使うので一つ ) // ******************************* public void sendUpload(String url, String field, String name, InputStream inputStream, String mime, final OnAsyncTaskListener listener ) { // 引数は、専用クラス UploadParam uploadParam = new UploadParam(url,field,name,inputStream,mime); new AsyncTask<UploadParam,Void,String>(){ @Override protected String doInBackground(UploadParam... params) { String result = "[\"error\"]"; UploadParam uploadParam = params[0]; InputStream inputStream = uploadParam.getInputStream(); Source source = Okio.source(inputStream); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); BufferedSink bufferedSink = Okio.buffer(Okio.sink(byteArrayOutputStream)); try { bufferedSink.writeAll(source); bufferedSink.close(); source.close(); } catch (IOException e) { e.printStackTrace(); } MultipartBody.Builder multipartBodyBuilder = new MultipartBody.Builder(); multipartBodyBuilder.setType(MultipartBody.FORM); multipartBodyBuilder.addFormDataPart( uploadParam.getField(), uploadParam.getName(), RequestBody.create(MediaType.parse(uploadParam.getMime()),byteArrayOutputStream.toByteArray()) ); RequestBody requestBody = multipartBodyBuilder.build(); // 送信用のデータを作成 Request.Builder requestBuilder = new Request.Builder(); requestBuilder.url(uploadParam.getUrl()); requestBuilder.post(requestBody); Request request = requestBuilder.build(); // 受信用のオブジェクトの準備 Call call = HttpAccess.this.okHttpClient.newCall(request); // 送信と受信 try { Response response = call.execute(); result = response.body().string(); } catch (Exception ex) { ex.printStackTrace(); } return result; } @Override protected void onPostExecute(String s) { listener.onAsyncTaskListener(s); } }.execute(uploadParam); } private class UploadParam { private String url; private String mime; private String field; private String name; private InputStream inputStream; public UploadParam(String url, String field, String name, InputStream inputStream, String mime) { this.url = url; this.mime = mime; this.field = field; this.name = name; this.inputStream = inputStream; } public String getUrl() { return url; } public String getMime() { return mime; } public String getField() { return field; } public String getName() { return name; } public InputStream getInputStream() { return inputStream; } } }
ファイルアップロード呼び出しサンプル
try { InputStream inputStream = assetManager.open("sample.jpg"); httpAccess.sendUpload( "http://10.0.2.2/r101/php_upload/file_upload.php", "target", "sample.jpg", inputStream, "image/jpeg", new HttpAccess.OnAsyncTaskListener() { @Override public void onAsyncTaskListener(String s) { Log.i("lightbox", s); } } ); } catch (IOException e) { e.printStackTrace(); }
Post 呼び出しサンプル
HashMap<String,String> postData = new HashMap<String,String>(); // localhost の 環境 postData.put("url", "http://10.0.2.2/r101/login-action/syain/syain_update.php"); postData.put("fld_code", syain_base.code ); postData.put("fld_simei", syain_base.name ); httpAccess.sendPost(postData,new HttpAccess.OnAsyncTaskListener() { @Override public void onAsyncTaskListener(String s) { Log.i("lightbox",s); if ( !s.equals("[\"error\"]") ) { // 再表示 listView.setAdapter(arrayAdapter); } else { Toast.makeText(MainActivity.this,"インターネットアクセスに失敗しました",Toast.LENGTH_LONG).show(); } } });