【Java】HTTP通信でリクエストを取得する方法

## はじめに
Javaを使用したHTTP通信でフロントからのリクエストを取得する方法を初心者向けにご紹介します。

今回JavaでHTTP通信でリクエストを取得するにあたって、ServletというJavaプログラムを利用します。

サーブレットとは、TomcatなどのWEBサーバー上で動くJavaプログラムで、
WEBブラウザからの要求に応えたり、送られてきたデータを処理したりする役割をしています。

今回のサンプルプログラムでは、WEBブラウザからリクエストを投げ、
簡単なHTMLのレスポンスをブラウザへ返却するというプログラムを作成していきます。

## 1. 開発環境
以降、以下のバージョン、環境での解説となります。

IDE：eclipse
Javaバージョン：8
Tomcat:8

## 2. ディレクトリ構成
今回のサンプルプログラムのフォルダ構成は以下の通りです。
<img width="278" alt="20190418-000121.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298750/9c773dbc-cf6c-a03e-2581-04ca89ff1938.png">

## 3. プロジェクトの作成
まずは新規プロジェクトの作成から「動的Webプロジェクト」を選択し、次へ進みます。

<img width="527" alt="スクリーンショット 2019-04-16 23.59.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298750/b14dd992-b8d8-f43a-5117-03cab83a4e48.png">

次にプロジェクト名を「SampleHttpServer」とします。
また、ターゲットランタイムが「Tomcat8」となっていることを確認してください。
問題なければ完了ボタンを押してください。

<img width="524" alt="スクリーンショット 2019-04-17 0.00.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298750/06d85e04-1b85-11d4-cb98-80694cc9d7a9.png">

## 4. サーブレット作成
まずsrcディレクトリで右クリックし、新規>その他を選択してください。

<img width="525" alt="スクリーンショット 2019-04-17 0.04.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298750/cd917f9b-1ce5-8f0f-5afd-30358d244137.png">

すると、以下のようなブラウザがでてきますので、「サーブレット」を選択し、次に進んでください。

<img width="524" alt="スクリーンショット 2019-04-17 0.04.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298750/33102c3a-e4d0-4f37-718f-c42eaef2b9a6.png">

続いて、クラス名を「HttpServletTest」としてください。
Javaパッケージは記載してもしなくてもどちらでもよいです。
記載しなければ、デフォルトパッケージの中にサーブレットが作成されます。

クラス名記入しましたら、次へ進んでください。

<img width="524" alt="スクリーンショット 2019-04-17 0.07.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298750/cf54d7b6-779a-d409-06e5-8a1883ef01b7.png">

スーパークラスのコンストラクターや継承された抽象メソッドのチェックをはずしてください。
※チェックしたままでもいいのですが、今回使用しないサンプルコードが記載されていたりするので、今回はチェックを外します。

<img width="523" alt="スクリーンショット 2019-04-17 0.10.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298750/5806c74e-c812-e39c-0ca9-fc99983cb2f4.png">

完了を押してサーブレットクラスの作成完了です。

## 5. サンプルPGM
今回は、`http://localhost:8080/SampleHttpServer/HttpServletTest`というURLをブラウザで実行すると「Sucess!」とブラウザに返却される簡単なPGMを作成していきます。

まず、アノテーション部分を以下のように書き換えます。

nameはサーブレットの名前を指していて記載しなくても動くのですが、慣習的に記載することが多いです。
urlPatternsはこのサーブレットにアクセスするためのURL(相対パス)です。

「private static final long serialVersionUID = 1L」というのはデータの読み書きを行う際のおまじないのようなものという程度の理解でOKです。


```bash:java
@WebServlet(name = "HttpServletTest", urlPatterns = { "/HttpServletTest" })
public class HttpServletTest extends HttpServlet {
	private static final long serialVersionUID = 1L;
}
```

次に、ブラウザからリクエストを受領し、HTMLのレスポンスを返却するソースコードを記載します。

```bash:java
@WebServlet(name = "HttpServletTest", urlPatterns = { "/HttpServletTest" })
public class HttpServletTest extends HttpServlet {
	private static final long serialVersionUID = 1L;

        // 今回追加する部分
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println("リクエスト受領");
		//HTTPレスポンスヘッダのコンテンツタイプ
		response.setContentType("text/html");

		//HTTPボディ部
		PrintWriter out = response.getWriter();
		out.println("<!DOCTYPE html>");
		out.println("<html>");
		out.println("<head>");
		out.println("<meta charset=\"UTF-8\">");
		out.println("<title>Test</title>");
		out.println("</head>");
		out.println("<body>");
		out.println("<h1>Success!</h1>");
		out.println("</body>");
		out.println("</html>");
		System.out.println("レスポンス返却");
	}
```

まず、doget()メソッドですが、GETリクエストするときは毎回上記のような記載方法となります。

レスポンスを返却する場合は、setContentTypeでどのような形態でレスポンスを返却するかを指定しています。
今回はHTMLでレスポンスを返却するので、"text/html"と指定しています。

そして、response.getWriter()メソッドでクライアントに対して文字を出力するための「PrintWriter」クラスのオブジェクトを取得し、HTMLテキストを出力していきます。

また、サーバ側で受領したことをチェックするために、Sytem.out.printlnでリクエストの受領とレスポンスの返却がわかるようにしてます。

## 6. サンプルPGM実行
プロジェクトを右クリックし、サーバーで実行を押下します。

<img width="482" alt="スクリーンショット 2019-04-17 0.17.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298750/7afe0818-d06d-148b-0d97-fd99e9c922c0.png">

<img width="534" alt="スクリーンショット 2019-04-17 0.18.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298750/73770feb-44c4-dab5-abcf-5da015171bc4.png">

サーバーが起動したら、以下のURLをブラウザで実行し、下記のように「Success!」と表示されたらOKです。
また、コンソールに「リクエスト受領・レスポンス返却」というログが出力されていることを確認してください。

http://localhost:8080/SampleHttpServer/HttpServletTest

![スクリーンショット 2019-04-17 0.19.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298750/02bfcc98-80d8-50c9-a117-e924c15415a0.png)

# さいごに
2020年から個人ブログはじめました！

フリーランスエンジニアになって得た知識と経験をもとに、フリーランスエンジニアに関する情報をはじめ、IT技術情報や業界情報、エンジニアライフハック等のコンテンツを配信していく予定です。

まだまだ記事数は少ないのですが、週単位で更新してますので、もしご興味ございましたら、みていただけると嬉しいです。

https://yacchi-engineer.com/