AndroidStudioでOkHttp3(GET、POST)

OkHttp3を使ってGETとPOSTのリクエストを投げる。

# 作ったもの
<img width="273" alt="スクリーンショット 2019-04-24 18.50.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325419/980d4276-a255-eed0-9425-12c89d4e3fc2.png">
GET、POSTボタンを配置し、ボタンを押したらそれぞれのメソッドリクエストを送信する。

## MainActivity
```java: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
```java: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
```java: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と同じです。