Retrofit2とOkhttp3とGsonを使用してAPIを作成（Java）

API作成時の備忘録。
細かい説明は抜きにして、とりあえずこれで通信できた。

- [Retrofit2](https://square.github.io/retrofit/)
- [Okhttp3](https://square.github.io/okhttp/)
- [Gson](https://github.com/google/gson)

##手順
- manifestfileに通信を許可するように設定
- リクエスト、レスポンスを受け取る用のクラスを定義
- エンドポイントの作成
- HTTPクライアントの作成
- 実行

## manifestFileに通信を許可するように設定

```AndroidManifest.xml``` に以下を記述する

```java:AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET" />
```

## リクエスト、レスポンスを受け取る用のクラスを定義

ログイン用のリクエストクラス、 requestのbodyがこの形式で送られる

```java:LoginRequest.java
package com.example.bookmanager_android.models.requests;

public class LoginRequest {
    private String email;
    private String password;

    public LoginRequest(String email, String passWord){
        this.email = email;
        this.password = passWord;
    }
}
```

- レスポンスクラス

ログイン用のレスポンスクラス、responseがこの形で受け取られる

```java:LoginResponse.java
package com.example.bookmanager_android.models.requests.response;

public class LoginResponse {
    public int status;
    public Result result;

    public static class Result {
        public int id;
        public String email;
        public String token;
    }
}
```

## エンドポイントを作成する

 interfaceを作成

```java:RequestApiService

public interface RequestApiService {
    @POST("/login") // API エンドポイント
    Call<LoginResponse> logIn(@Body LoginRequest requestBody); 
    // logInメソッドが呼ばれると,body形式は上記で作った、LoginRequestクラスの形になる
}
```

## HTTPクライアントの作成

```java:HttpClient.java
public class HttpClient {
    public static RequestApiService apiService;

    private static final String URL = "http://baseurl"; // BaseUrlを指定

    // Okhttp
    private static final OkHttpClient client = new OkHttpClient.Builder()
            .connectTimeout(10, TimeUnit.SECONDS)
            .writeTimeout(10, TimeUnit.SECONDS)
            .readTimeout(30, TimeUnit.SECONDS)
            .build();
    // GSON
    private static final Gson gson = new GsonBuilder()
            .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
            .create();

    // RetrofitにGSONとOkhttpを組み合わせてHttpクライアントの作成
    public static RequestApiService getRequestApiService() {
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(URL)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .client(client)
                .build();
        apiService = retrofit.create(RequestApiService.class);
        return apiService;
    }

```

## 実行

```java:SignInFragment.java

private boolean starLogin(String emailStr, String passwordStr) {
        // bodyの作成
        LoginRequest requestBody = new LoginRequest(emailStr, passwordStr);
        // HTTPクライアントの呼び出し
        RequestApiService apiService = HttpClient.getRequestApiService();

        // 通信開始　interfaceで定義した処理が呼ばれる
        apiService.logIn(requestBody).enqueue(new Callback<LoginResponse>() {
            @Override
            public void onResponse(Call<LoginResponse> call, Response<LoginResponse> response) {
                if (response.isSuccessful()) {
                   // 通信処理成功時の処理を記載
                } else {
                    Log.e("SignInFragment", "Something wrong On Response: " + response.toString());   
                }
            }

            @Override
            public void onFailure(Call<LoginResponse> call, Throwable t) {
                // 通信処理失敗時の処理を記載
            }
        });
        return true;
    }
```

## 所感
tokenの保持とか、成功失敗時の処理とかまだあるが、とりあえずこれで通信はできた。