これは REST 解析の最後の部分です。前の部分:
プロジェクトの作成
このセクションでは、Spring Boot を使用して小さな RESTful アプリケーションを作成します。私たちのアプリケーションは、分析の最後の部分の例にある CRUD (作成、読み取り、更新、削除) 操作をクライアントに実装します。まず、メニュー [ファイル] -> [新規] -> [プロジェクト]を使用して新しい Spring Boot アプリケーションを作成しましょう。 開いたウィンドウで、Spring Initializr を選択し、プロジェクト SDK を指定します。 [次へ] ボタンをクリックします。次のウィンドウで、Maven プロジェクト タイプを指定し、グループとアーティファクトを指定します。 [次へ] ボタンをクリックします。次のウィンドウでは、プロジェクトに必要な Spring Framework コンポーネントを選択する必要があります。Spring Web で十分です。 「次へ」ボタンをクリックします。次に残っているのは、プロジェクトの名前とファイル システム内の場所を指定することだけです。 [完了] ボタンをクリックします。プロジェクトが作成され、その構造が確認できます。IDEA が Maven ビルド システム デプロイメント記述子 (pom.xml) とメイン アプリケーション クラスを生成しましたRestExampleApplication
。彼らのコードは次のとおりです。
pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.javarush.lectures</groupId>
<artifactId>rest_example</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>rest_example</name>
<description>REST example project</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
残りの例アプリケーション:
@SpringBootApplication
public class RestExampleApplication {
public static void main(String[] args) {
SpringApplication.run(RestExampleApplication.class, args);
}
}
REST機能の作成
私たちのアプリケーションはクライアントを管理します。したがって、最初に行う必要があるのは、顧客エンティティを作成することです。これはPOJOクラスになります。model
パッケージ内にパッケージを作成しましょうcom.javarush.lectures.rest_example
。パッケージ内にmodel
クラスを作成しましょうClient
。
public class Client {
private Integer id;
private String name;
private String email;
private String phone;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
}
このサービスはクライアント上で CRUD 操作を実装します。次のステップは、これらの操作を実装するサービスを作成することです。パッケージ内でcom.javarush.lectures.rest_example
パッケージを作成しservice
、その中にインターフェースを作成しますClientService
。コメント付きのインターフェイス コードは次のとおりです。
public interface ClientService {
/**
* Создает нового клиента
* @param client - клиент для создания
*/
void create(Client client);
/**
* returns список всех имеющихся клиентов
* @return список клиентов
*/
List<client> readAll();
/**
* returns клиента по его ID
* @param id - ID клиента
* @return - an object клиента с заданным ID
*/
Client read(int id);
/**
* Обновляет клиента с заданным ID,
* в соответствии с переданным клиентом
* @param client - клиент в соответсвии с которым нужно обновить данные
* @param id - id клиента которого нужно обновить
* @return - true если данные были обновлены, иначе false
*/
boolean update(Client client, int id);
/**
* Удаляет клиента с заданным ID
* @param id - id клиента, которого нужно удалить
* @return - true если клиент был удален, иначе false
*/
boolean delete(int id);
}
次に、このインターフェースの実装を作成する必要があります。これで、クライアント リポジトリとして機能しますMap<Integer, Client>
。カード キーはクライアント ID になり、値はクライアント自体になります。これは、データベースの操作の詳細で例が過負荷にならないようにするために行われました。ただし、将来的には、実際のデータベースに接続できるインターフェイスの別の実装を作成できるようになります。パッケージ内でservice
インターフェースの実装を作成しますClientService
。
@Service
public class ClientServiceImpl implements ClientService {
// Хранorще клиентов
private static final Map<Integer, Client> CLIENT_REPOSITORY_MAP = new HashMap<>();
// Переменная для генерации ID клиента
private static final AtomicInteger CLIENT_ID_HOLDER = new AtomicInteger();
@Override
public void create(Client client) {
final int clientId = CLIENT_ID_HOLDER.incrementAndGet();
client.setId(clientId);
CLIENT_REPOSITORY_MAP.put(clientId, client);
}
@Override
public List<Client> readAll() {
return new ArrayList<>(CLIENT_REPOSITORY_MAP.values());
}
@Override
public Client read(int id) {
return CLIENT_REPOSITORY_MAP.get(id);
}
@Override
public boolean update(Client client, int id) {
if (CLIENT_REPOSITORY_MAP.containsKey(id)) {
client.setId(id);
CLIENT_REPOSITORY_MAP.put(id, client);
return true;
}
return false;
}
@Override
public boolean delete(int id) {
return CLIENT_REPOSITORY_MAP.remove(id) != null;
}
}
アノテーションは、@Service
このクラスがサービスであることを Spring に伝えます。これは、アプリケーションの一部のビジネス ロジックが実装される特別なタイプのクラスです。その後、このアノテーションのおかげで、Spring は、Dependency Injection を使用して、必要な場所にこのクラスのインスタンスを提供します。次はコントローラーを作成します。エンドポイント (URI) に対するクライアント要求を処理するロジックを実装する特別なクラス。わかりやすくするために、このクラスを部分的に作成します。まず、クラス自体を作成し、そのクラスへの依存関係を導入しましょうClientService
。
@RestController
public class ClientController {
private final ClientService clientService;
@Autowired
public ClientController(ClientService clientService) {
this.clientService = clientService;
}
}
アノテーションを明確にしましょう。 @RestController - このクラスが REST コントローラーであることを Spring に伝えます。それらの。このクラスはクライアント要求を処理するためのロジックを実装します @Autowired - この場所に依存関係を注入する必要があることを Spring に伝えます。インターフェースをコンストラクターに渡しますClientService
。先ほどこのサービスの実装にアノテーションを付けました@Service
。これで、Spring はこの実装のインスタンスをコントローラー コンストラクターに渡すことができるようになります。次に、CRUD 操作を処理するために各コントローラー メソッドを段階的に実装します。作成操作から始めましょう。これを行うには、メソッドを作成しましょうcreate
。
@PostMapping(value = "/clients")
public ResponseEntity<?> create(@RequestBody Client client) {
clientService.create(client);
return new ResponseEntity<>(HttpStatus.CREATED);
}
このメソッドを見てみましょう: @PostMapping(value = "/clients")
- ここでは、このメソッドが /clients アドレスへの POST リクエストを処理することを意味しており、メソッドは を返しますResponseEntity<?>
。ResponseEntity
- 応答を返すための特別なクラス。これを使用すると、後で HTTP ステータス コードをクライアントに返すことができます。このメソッドはパラメータを受け取り@RequestBody Client client
、このパラメータの値はリクエスト本文から置き換えられます。要約ではこれについて説明しています @RequestBody
。メソッドの本体内で、以前に作成したサービスの create メソッドを呼び出し、パラメーターで受け入れられたクライアント コントローラーに渡します。ResponseEntity
次に、新しいオブジェクトを作成し、必要な列挙値をそれに渡すことによって、ステータス 201 Created を返しますHttpStatus
。次に、操作を実装しますRead
。 まず、利用可能なすべてのクライアントのリストを取得する操作を実装します。
@GetMapping(value = "/clients")
public ResponseEntity<List<Client>> read() {
final List<Client> clients = clientService.readAll();
return clients != null && !clients.isEmpty()
? new ResponseEntity<>(clients, HttpStatus.OK)
: new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
分析を開始しましょう: @GetMapping(value = "/clients")
- すべてはアノテーションと似ています@PostMapping
が、ここでは GET リクエストを処理するだけです。今回は を返しますがResponseEntity<List<Client>>
、今回のみ、HTTP ステータスに加えて、クライアントのリストとなる応答本文も返します。Spring REST コントローラーでは、すべての POJO オブジェクトと、応答本文として返される POJO オブジェクトのコレクションは、明示的に指定されていない限り、自動的に JSON にシリアル化されます。これには非常に満足しています。メソッド内では、サービスを使用して、すべてのクライアントのリストを取得します。次に、リストが null または空でない場合は、ResponseEntity
クラスを使用してクライアントのリストと HTTP ステータス 200 OK を返します。それ以外の場合は、単に HTTP ステータス 404 Not Found を返します。次に、クライアントを ID で受信する機能を実装します。
@GetMapping(value = "/clients/{id}")
public ResponseEntity<Client> read(@PathVariable(name = "id") int id) {
final Client client = clientService.read(id);
return client != null
? new ResponseEntity<>(client, HttpStatus.OK)
: new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
新しい点は、パス変数が追加されたことです。URI で定義される変数。value = "/clients/{id}"
。それを中括弧で示しました。そして、メソッドのパラメータでは、int
アノテーションを使用してそれを変数として受け入れます@PathVariable(name = "id")
。このメソッドは、 形式の URI のリクエストを受け入れます/clients/{id}
が、代わりに{id}
任意の数値を使用できます。この値はその後、変数int id
(メソッド パラメーター) に渡されます。本体では、Client
サービスを使用してオブジェクトを受け取り、受け入れられますid
。そして、リストから類推して、200 OK ステータスとオブジェクト自体を返すか、システム内にこれを持つクライアントがないClient
場合は単純に 404 Not Found ステータスを返します。id
更新と削除という 2 つの操作を実装する必要があります。これらのメソッドのコードは次のとおりです。
@PutMapping(value = "/clients/{id}")
public ResponseEntity<?> update(@PathVariable(name = "id") int id, @RequestBody Client client) {
final boolean updated = clientService.update(client, id);
return updated
? new ResponseEntity<>(HttpStatus.OK)
: new ResponseEntity<>(HttpStatus.NOT_MODIFIED);
}
@DeleteMapping(value = "/clients/{id}")
public ResponseEntity<?> delete(@PathVariable(name = "id") int id) {
final boolean deleted = clientService.delete(id);
return deleted
? new ResponseEntity<>(HttpStatus.OK)
: new ResponseEntity<>(HttpStatus.NOT_MODIFIED);
}
これらの方法には本質的に新しいものはないため、詳細な説明は省略します。唯一言及する価値があるのは、メソッドがupdate
PUT リクエスト ( annotation @PutMapping
) を処理し、メソッドがdelete
DELETE リクエスト ( annotation DeleteMapping
) を処理することです。完全なコントローラー コードは次のとおりです。
@RestController
public class ClientController {
private final ClientService clientService;
@Autowired
public ClientController(ClientService clientService) {
this.clientService = clientService;
}
@PostMapping(value = "/clients")
public ResponseEntity<?> create(@RequestBody Client client) {
clientService.create(client);
return new ResponseEntity<>(HttpStatus.CREATED);
}
@GetMapping(value = "/clients")
public ResponseEntity<List<Client>> read() {
final List<client> clients = clientService.readAll();
return clients != null && !clients.isEmpty()
? new ResponseEntity<>(clients, HttpStatus.OK)
: new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
@GetMapping(value = "/clients/{id}")
public ResponseEntity<Client> read(@PathVariable(name = "id") int id) {
final Client client = clientService.read(id);
return client != null
? new ResponseEntity<>(client, HttpStatus.OK)
: new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
@PutMapping(value = "/clients/{id}")
public ResponseEntity<?> update(@PathVariable(name = "id") int id, @RequestBody Client client) {
final boolean updated = clientService.update(client, id);
return updated
? new ResponseEntity<>(HttpStatus.OK)
: new ResponseEntity<>(HttpStatus.NOT_MODIFIED);
}
@DeleteMapping(value = "/clients/{id}")
public ResponseEntity<?> delete(@PathVariable(name = "id") int id) {
final boolean deleted = clientService.delete(id);
return deleted
? new ResponseEntity<>(HttpStatus.OK)
: new ResponseEntity<>(HttpStatus.NOT_MODIFIED);
}
}
その結果、プロジェクトの構造は次のようになります。
立ち上げとテスト
main
アプリケーションを実行するには、クラス内のメソッドを実行するだけですRestExampleApplication
。RESTful Web サービスをテストするには、新しいソフトウェアをダウンロードする必要があります) 実際、GET リクエストは通常のブラウザから非常に簡単に送信できますが、POST、PUT、DELETE の場合は通常のブラウザでは十分ではありません。心配しないでください。Postman を使用して HTTP リクエストを送信できます。ここからダウンロードできます。ダウンロードしてインストールした後、アプリケーションのテストを開始します。これを行うには、プログラムを開いて新しいリクエストを作成します。 左上隅にある「新規」ボタンをクリックします。次に、「リクエスト」を選択します。 次に、名前を付けて保存します。次に、POST リクエストをサーバーに送信して、最初のクライアントを作成してみましょう。 この方法でいくつかのクライアントを作成します。次に、リクエスト タイプを GET に変更してサーバーに送信します。
一般的な結果
おめでとうございます。REST についてかなり詳しく説明しました。すべての資料が膨大になりましたが、お役に立てば幸いです。-
RESTとは何かを学びました。
-
REST の歴史について学びました。
-
このアーキテクチャ スタイルの制限と原則について話しました。
- アーキテクチャをクライアントサーバーモデルに持ち込む。
- 状態の欠如。
- キャッシング;
- 界面の均一性。
- 層。
- コードオンデマンド (オプションの制限)。
-
REST が提供する利点を調べました
-
HTTP プロトコルを使用してサーバーとクライアントがどのように相互作用するかを詳細に調査しました。
-
リクエストとレスポンスを詳しく見てみましょう。それらのコンポーネントは分解されました。
-
最後に、練習に移り、Spring Boot で独自の小さな RESTful アプリケーションを作成しました。そして、Postman プログラムを使用してテストする方法も学びました。
宿題
次のことを試してください。- 上記の説明に従って、独自の Spring Boot プロジェクトを作成し、その中に講義と同じロジックを実装します。すべてを 1 in 1 で繰り返します。
- 起動してください。応用。
- Postman (またはリクエストを送信するための他のツール (curl も含む)) をダウンロードしてセットアップします。
- 講義で説明したのと同じ方法で POST リクエストと GET リクエストをテストします。
- PUT リクエストと DELETE リクエストを自分でテストしてください。
GO TO FULL VERSION