[リサーチ・メモ]ClientBuilderでSendGrid実装

## 背景
仕事で使用する予定だったSendGridを、事前の自己学習では、pomに依存関係を追加する方法で利用していた。
しかし、実際はClientBuilderで実装することとなり、触ったことが無かった為、備忘録として纏める。

## 自己学習での方法
1\. 下記をpomに記載し依存関係を追加
```
		<dependency>
		    <groupId>com.sendgrid</groupId>
		    <artifactId>sendgrid-java</artifactId>
		    <version>4.7.0</version>
		</dependency>
```

2\. ライブラリをインポートする
```
import com.sendgrid.Method;
import com.sendgrid.Request;
import com.sendgrid.Response;
import com.sendgrid.SendGrid;
```

3\. メール本文を作成し送信する
今回は事前に作成したテンプレートに文字を埋め込み送信する
※[ドキュメント](https://sendgrid.kke.co.jp/docs/Tutorials/A_Transaction_Mail/using_dynamic_templates.html)
![テンプレート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1559909/08cc4b0f-e91c-0617-9819-1cbcdc8c33dd.png)
```
	@Override
	public void sendEmail(InquiryInfo InquiryInfo) throws IOException {

		try {
			SendGrid sg = new SendGrid(dotenv.get("作成したAPIKEY"));
			Request request = new Request();
			request.setMethod(Method.POST);
			request.setEndpoint("mail/send");
			request.setBody("{\"personalizations\":[{\"to\":[{\"email\":\"sendEmail\"}],"
					+ "\"dynamic_template_data\":{\"name\": \"sendName\", \"content\":\"sendContent\"},"
					+ "\"from\":{\"email\":\"test@test.com\"},"
					+ "\"template_id\": \"作成したテンプレートID\"}");
			String replaceBody = request.getBody().replace("sendEmail", InquiryInfo.getEmail())
					.replace("sendName", InquiryInfo.getLastName() + InquiryInfo.getFirstName())
					.replace("sendContent", InquiryInfo.getContent());
			request.setBody(replaceBody);
			System.out.println(request.getBody());
			Response response = sg.api(request);
			System.out.println(response.getStatusCode());
			System.out.println(response.getBody());

		} catch (IOException ex) {
			System.out.println(ex);
			throw ex;
		}
	}
```


## ClientBuilderを用いた方法
1\. 下記をpomに記載し依存関係を追加
```
    <dependency>
        <groupId>org.glassfish.jersey.core</groupId>
        <artifactId>jersey-client</artifactId>
        <version>2.1</version>
    </dependency>
```

2\. ライブラリをインポートする
```
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.Invocation.Builder;
import java.net.URI;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
```

3\. 変数を宣言する
```
private Builder builder;
```

4\. インスタンスを生成し、リクエストの準備を行う
```
builder = ClientBuilder.newBuilder().build()
        .target(new URI("エンドポイント")).path("/v3/mail/send")
        .request(MediaType.APPLICATION_JSON_TYPE).header("Authorization", "Bearer " + "作成したAPIKEY");
```
|ソース|詳細|
|:--:|:--:|
|「ClientBuilder.newBuilder().build()」|Clientオブジェクトを生成|
|「.target(new URI("エンドポイント"))」|リクエストのターゲットとなるAPIエンドポイントのURIを指定|
|「.path("/v3/mail/send")」|ターゲットURIにパスを追加|
|「.request(MediaType.APPLICATION_JSON_TYPE)」|リクエストのメディアタイプをjsonとして指定|
|「.header("Authorization", "Bearer " + "作成したAPIKEY")」|リクエストヘッダーを指定|

5\.メール本文を作成し送信する
```
String sendMailParameter = {\"personalizations\":[{\"to\":[{\"email\":\"test@test.com\"}],"
					+ "\"dynamic_template_data\":{\"name\": \"氏名\", \"content\":\"内容\"},"
					+ "\"from\":{\"email\":\"test@test.com\"},"
					+ "\"template_id\": \"作成したテンプレートID\"}"
Response response = builder.post(Entity.json(sendMailParameter));
```