WEB APIテスト(Apache Maven環境)

#概要
Apache MavenでWEB APIのサンプルソースを実行します。
CentOS環境の内で実行と他のPCでも確認します。

#事前作業
①vmware環境にCentOSをインストールします。次のリンクから確認してみてください。
https://qiita.com/neomi/items/d1006fc24e5d4cd5aa7d

②CentOS環境にApache Mavenをインストールします。次のリンクから確認してみてください。
https://qiita.com/neomi/items/cf03c5fd9f30c6a4294b

#サンプルソースダウンロード及び実行
サンプルソースをダウンロードと一部テスト用のソースを追加してから実行します。

①次のコマンドでサンプルソースをダウンロードします。

~~~bash
git clone https://github.com/spring-guides/gs-rest-service.git
~~~

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/04bd2896-11c1-bf2b-6aa5-98ffd99cfdd4.png)

②次のパスに移動します。

~~~bash
cd gs-rest-service/initial/src/main/java/com/example/
~~~

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/936b6b86-880a-a079-462c-825ec47cc405.png)

③次の２つのファイルを作成します。
Greeting.java

~~~bash
package com.example.restservice;

public class Greeting {

    private final long id;
    private final String content;

    public Greeting(long id, String content) {
        this.id = id;
        this.content = content;
    }

    public long getId() {
        return id;
    }

    public String getContent() {
        return content;
    }
}
~~~

GreetingController.java

~~~bash
package com.example.restservice;

import java.util.concurrent.atomic.AtomicLong;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class GreetingController {

    private static final String template = "Hello, %s!";
    private final AtomicLong counter = new AtomicLong();

    @GetMapping("/greeting")
    public Greeting greeting(@RequestParam(value = "name", defaultValue = "World") String name) {
        return new Greeting(counter.incrementAndGet(), String.format(template, name));
    }
}
~~~

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/48c60dfe-3475-5d3f-1e50-aa9f911c1a90.png)

④次のコマンドでパスを移動します。

~~~bash
cd /home/dev-user/gs-rest-service/initial/
~~~

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/c8cc64cd-8ebc-22a2-ef92-ed8ff8d19b70.png)

⑤次のコマンドでサンプルソースを実行します。

~~~bash
 ./mvnw spring-boot:run
~~~
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/0cc71cee-8bfe-d930-dc6f-9a8d07a4195d.png)

#WEB APIテスト（仮想マシン環境）
①ブラウザからテストする場合は、以下のURLにアクセスしてください。

~~~bash
http://localhost:8080/greeting
~~~

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/5ee01dfd-f17b-f782-27c4-1ca45f9b7dde.png)

②コンソルプロンプトを起動して次のコマンドを実行して確認します。

~~~bash
curl http://localhost:8080/greeting
~~~

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/c2b0532f-d931-1e48-250a-31ca96071074.png)

#WEB APIテスト（ローカルPC環境）
ローカルPCでは以下の実行で正しく実行されないことが分かります。
次のネットワーク設定を変えてから再度実行します。

①ローカルPCでプロンプトを起動して以下のコマンドを実行します。

~~~bash
# 仮想マシンのlocalhostを指定して実行
curl http://localhost:8080/greeting

# 仮想マシンのIPを指定して実行
curl http://192.168.244.128:8080/greeting
~~~

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/e8a3e3c0-75f6-7569-ed4e-5e9aa0592062.png)

#仮想マシンのネットワーク接続変更

①現在開いているvmwareを閉じてから次の画面で「仮想マシン設定の編集」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/2a1fd00f-edd1-bbc3-3895-21a76b16553b.png)

②次の画面通りに設定を変更します。
●変更前
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/eac5d791-788b-5913-a0cb-5b7a19847854.png)
●変更後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/4607afeb-d78c-7ed8-1b14-8126fb843208.png)

#ファイアウォールのポート開放
仮想マシンのポートが開放されていない場合、他のPCからアクセスができなくてタイムアウトが発生するので、以下の手順で設定を行ってください。

①既存のポート情報を確認します。

~~~bash
[dev-user@localhost ~]$  firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens33
  sources: 
  services: dhcpv6-client ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
~~~

②8080ポートを開放する方法は以下の２つがあります。
●即時反映

~~~bash
[dev-user@localhost ~]$ firewall-cmd --zone=public --add-port=8080/tcp
success
~~~

●恒久的な設定の反映

~~~bash
[dev-user@localhost ~]$ firewall-cmd --zone=public --add-port=8080/tcp --permanent
success
~~~

③既存のポート情報を再確認します。

~~~bash
[dev-user@localhost ~]$  firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens33
  sources: 
  services: dhcpv6-client ssh
  ports: 8080/tcp
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

~~~


#IPアドレスを再確認
ネットワーク接続変更前と変更後のIPが異なっていることが分かります。
●変更前：192.168.244.128
●変更後：192.168.1.33

①次のコマンドでIPアドレスを確認します。

~~~bash
ifconfig
~~~

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/bc8a2432-8cc4-ffa9-9b62-e9cee32c50c6.png)

②次のコマンドでWEB APIをテストします。

~~~bash
curl http://192.168.1.33:8080/greeting
~~~

●1回目の実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/a227f2c0-dea3-d982-d067-af5acf347f2c.png)

●2回目の実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/66eb7531-161d-a881-a831-d07b51e1e4d8.png)

#その他
ポートが正しく起動されているか確認するコマンド

~~~bash
netstat -na | grep 8080
netstat -na | grep LISTEN
~~~

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/cad5de54-08f2-052b-a2c9-90d6ca27e2e0.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/f90731d5-f768-7908-b396-cfbb721cce7a.png)

#参考サイト
・REST API の作成
https://spring.pleiades.io/guides/gs/rest-service/#initial

・VMware のネットワーク設定と格闘した話
https://qiita.com/suzuki-maruchan/items/e5f7c539b04e2778a03b

・【すぐわかる】CentOSのポート開放のやり方
https://eng-entrance.com/linux-centos-port

#終わりに
仮想マシンでは実行されましたが、ローカルPCまたは他のPCでは実行ができない問題がありましたので、解決するため、対象サービスポートを開放とvmwareツールの中でネットワーク接続方法の変更が必要でした。
Tomcatも仮想マシンで正しく実行されているのであれば、上記の２つの設定を変更すればタイムアウトの問題が解決できると思います。