スッキリわかるJava入門 実践編 第３版 まとめ - part8 -ネットワークアクセス

# はじめに
こんにちは　◤●ㅅ●◥ﾉ

今回はネットワークアクセスについて学びました！
## 第８章　ネットワークアクセス
### 1.ネットワークAPIの全体像
Javaではネットワーク通信を簡単に実現するためのクラス群
→ __java.netパッケージ__

__低水準API__
細かい制御が可能だが、複雑で手間がかかる。本格的に利用
__高水準API__
簡単に使えるが細かいことができない。手軽に利用。

普段見ているWebページ
→  __HTML__ という専用の言葉で記述されたテキスト情報

java.net.URLクラスを使う
→Javaプログラムを介してインターネット上にあるHTMLや画像ファイルを簡単に取得できる

:star: java.net.URLクラスの利用
アクセスしたい情報のURLを元に、java.net.URLクラスを用いて、
インターネット上のWebサイトのデータを取得できる


### 2.Socketを用いた低水準アクセス
低水準APIの理解のためにはネトワークの基礎知識が必要

コンピュータの通信には定められた通信手順を踏む必要がある
あらかじめ定められた通信手順のルールのことを __プロトコル__　と呼ぶ
インターネットで使われるプロトコルは　__TCP/IP__　と呼ばれるもの

TCP/IPを使うには以下の２つの情報が必要
1.IPアドレス
　ネットワークにつながってるコンピュータに割り振られる番号
2.ポート番号
　通信相手のサーバーにはそれぞれ異なるサービスを提供している。
　サービスを区別するためにサーバ上のプログラムにポート番号が割り振られている

TCP/IPを使って接続を行うには、java.netパッケージのSocketクラスを使う
手順
1.IPアドレスまたはホスト名とポート番号を指定してSocketクラスをインスタンス化（new）する
`Socket sock = new Socket("dokojava.jp",80);`
2.Socketから入力ストリームと出力ストリームを取得する
`InputStream is = sock.getInputStream();`
`OutputStream os = sock.getOutputStream();`
3.２つのストリームを読み書きする
`int i = is.read();`
`os.write("HELLO");`
4.ソケットを閉じる
`sock.close();`

### 3.サーバ側ソフトウェアの開発
上記のところではサーバ上で「接続を行う側」のプログラム開発におけるクラスについて
以降は「接続を待ち受ける側」について

例：ショッピングサイトやインターネットバイキング
顧客のブラウザから届くHTTPリクエストを受け付ける
→計算や保存を行いその結果を HTMLとして返すプログラム
　　→Webアプリケーションと総称されるもの

通信を待ち受けるにはjava.netパッケージのServerSocketクラスを利用する

### 4.HTTPとWebAPI
HTTPの通信は、原則としてクライアントから始まるリクエストと
それに対するサーバからのレスポンスという文字情報の１往復で完結する特徴がある

このとき、Webサーバ上の何を要求するかを示すにはURLが用いられる

#### HTTPレスポンスの構造
##### 1.ステータスコード
レスポンスの１行目に含まれる３桁の数字が処理結果の概要を表すステータスコード
例：404 NotFound
　アクセス先のリソースが存在しないことを表す

##### 2.レスポンスヘッダ
レスポンスの２行目以降に返される補助的な情報
サーバが処理を行った時刻などのほか、
次に続くレスポンスボディのデータ形式を表すContent-Typeヘッダも含む

##### 3.レスポンスボディ
レスポンスヘッダの後に空の１行を挟んで送り返される、レスポンスの本体情報
Webサイトにアクセスした場合、HTMLの内容がレスポンスボディとして返される

#### HTTPリクエストのの構造
##### 1.リソースパス
リクエストの先頭行は、リクエストラインと呼ぶ
この行はスペースで３つに区切られその中で中央部分の「/index.html」がリクエストの宛先を示す
リソースパスになる

##### 2.リクエストメソッド
リクエストラインの冒頭に書かれる「GET」などの英単語
リソースに対してどのような依頼をするのかを指定するものであり、Javaのメソッドとは関係がない
HTTPが仕様で定めるメソッドは１０種類ありその中で代表的な４種類が以下のもの
・GET　リソース内容の取得　安全性⭕️　冪等性❌
・POST　リソースの追加　安全性❌　冪等性❌
・PUT　リソースの内容を上書きする　安全性❌　冪等性⭕️
・DElETE　リソースを削除する　安全性❌　冪等性⭕️

安全性とは
その操作がサーバの状態を変化させる性質があることを意味する概念のこと

冪等性（べきとうせい）とは
同じ要求を複数回行ったとしても副作用が起きない性質のこと
POSTメソッドが２回送られると二重に登録されてしまう

##### 3.クエリパラメータ
表示に関する補助的な情報としてクエリパラメータを追加できる
URLの松尾に「？」をつけ、その右側に指定したものがリクエスト１行目のリソースパスにも記述される
パラメータは「キー＝値」の形式で複数指定する場合はそれぞれ「＆」で区切るというルールになる

##### 4.リクエストヘッダ
リクエスト通信自体に関する補足的な情報を記述する
Content-Typeヘッダ、Aceptヘッダなどが代表的なもの

##### 5.リクエストボディ
主にPOSTやPUTメソッドで利用され、サーバに追加・上書きする内容を記述する
GETやDELETEの場合は送る情報がないため、通常は空で送信される

#### WebAPI
HTTP経由で依頼された高度な処理を行って結果を返すしくみをWebAPIと呼ぶ
これを活用したサービスやシステム間連携が増加している

:star: 公開される WebAPI
1.どのようなURLに（エンドポイントURL）
2.どのようなメソッドで
3.どのようなパラメータを付けて送ると
4.どのような動きをして
5.どのようなレスポンスが返るか


優れたWebAPIの基本構造や設計ノウハウが幅広くあり中でも有名なのはRESTという以下の設計哲学
:star:  RESTによるWebAPIの設計哲学
・システムが扱う現実世界の概念をURLとして表現する
・URLに対して、HTTPが定めるGET、POST、PUT、DELETEのメソッド
を本来の意味に基づいて用い、リソースを操作する
・レスポンスには通常、JSON形式を使う

#### JavaからのWebAPIアクセス
URLクラスはURやGETリクエストを送る際には便利
PUTやPOSTなどの利用にはjava.net.http.HttpClientクラスが便利

HttpClientクラスを利用する手順
1.HttpClientインスタンスを生成する
2.HttpRequestインスタンスを生成する
3.リクエストの実行とHttpRespeonseの取得

## まとめ
URLクラスを用いることで手軽にWebページを取得できる
Socketクラスを使うことでTCP/IP接続を行うことができる
インターネット上のWebサーバにアクセスしてページを取得し、
リンクで他のページを辿れる仕組みをWebという
WebではHTTPというプロトコルが利用され、１往復のリクエストとレスポンスで完結する
別のシステムからHTTPで接続を受け付け、連携して動作するWebAPIが普及している
HttpClientクラスを用いるとメソッド・パラメータ・本文などを細かく指定してHTTP通信を行える
代表的なWebAPIの設計哲学として、RESTがある

今回もありがとうございました！
ではまた〜　◤●ㅅ●◥ﾉ"