OkHttp3を使ってGETとPOSTのリクエストを投げる。
作ったもの
GET、POSTボタンを配置し、ボタンを押したらそれぞれのメソッドリクエストを送信する。MainActivity
MainActivity.java
package com.example.sampleapplication.sample.okhttp;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// GETボタンとPOSTボタン取得
Button getButton = findViewById(R.id.getButton);
Button postButton = findViewById(R.id.postButton);
// GETボタンがタップされた時
getButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
OkHttpGet getTask = new OkHttpGet();
getTask.execute();
}
});
// POSTボタンが押された時
postButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
OkHttpPost postTask = new OkHttpPost();
postTask.execute();
}
});
}
}
今回はGetとPostを行うクラスをそれぞれ別々に作り、それを呼び出すような形にした。
それぞれ
get.Task.execute();
postTask.execute();
で呼び出している。
GET
OkHttpGet.java
package com.example.sampleapplication.sample.okhttp;
import android.os.AsyncTask;
import android.util.Log;
import java.io.IOException;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class OkHttpGet extends AsyncTask<String,String,String> {
@Override
protected String doInBackground(String... strings) {
// url
String url = "GETリクエストのエンドポイント";
// レスポンスデータ
String strData = "";
// OkHttpのインスタンス生成
OkHttpClient client = new OkHttpClient();
// urlを含めてリクエストをビルド
Request request = new Request.Builder()
.url(url)
.get()
.build();
try {
// リクエスト実行
Response response = client.newCall(request).execute();
// レスポンスのbodyからデータ取得
strData = response.body().string();
} catch (IOException e) {
e.printStackTrace();
}
return strData;
}
@Override
protected void onPostExecute(String str) {
Log.d("Debug",str);
}
}
今回はurlにはクエリも含めたURLを設定しました。
時間のかかる処理はメインスレッドでは実行できないそうなので、AsyncTaskを使って非同期処理にしています。
doInBackgroundで時間のかかる処理(ここではOkHttpを使ったリクエスト)を行い、それが終了したら
onPostExecuteに処理が移る、という感じです。
onPostExecuteではdoInBackgroundで行った非同期処理の結果をメインスレッドに返してくれます。
なのでリクエストの結果を画面に表示させたい場合はこの中で行えばいいことになりますね。多分。
POST
OkHttpPost.java
package com.example.sampleapplication.sample.okhttp;
import android.os.AsyncTask;
import android.util.Log;
import java.io.IOException;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
public class OkHttpPost extends AsyncTask<String,String,String> {
public static final MediaType JSON = MediaType.get("application/json; charset=utf-8");
String json = "{\"name\":\"名前\", \"taxis\":\"分類\"}";
@Override
protected String doInBackground(String... strings) {
OkHttpClient client = new OkHttpClient();
String url = "POSTに使うURL";
RequestBody body = RequestBody.create(JSON, json);
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
try {
Response response = client.newCall(request).execute();
return response.body().string();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String str) {
Log.d("Debug",str);
}
}
POSTでjson形式のデータを渡しています。
そのほかはGETと同じです。