春コース7日目
53753 ワード
韓日
RESTful Webプロジェクト
クエリ
RESTful Webプロジェクト
start springによるプロジェクトの作成
https://start.spring.io/
上記のリンクからアイテムを作成します.


作成を続行>生成した圧縮ファイルをワークスペースに移動して解凍します.
を選択して、

実行時に出力されるページ.

spring-boot-devtoolsを追加します.迅速な使用を支援します.
GETユーザーの表示

新しいクラスの作成
- UserController -
@RestController
@RequestMapping("/users") // http://localhost:8080/users
public class UserController {
@GetMapping
public String getUser() {
return "유저 리스트 리턴";
}
@PostMapping
public String getCreaterUser() {
return "새 유저를 생성";
}
@PutMapping
public String getUpdateUser() {
return "유저 업데이트";
}
@DeleteMapping
public String geDeletetUser() {
return "유저 삭제";
}
}
postman http://localhost:8080/usersへの接続確認結果
GET

POST

PUT

DELETE
@PathVariableとしてpath変数を使用
- UserController -
getUser、getUserListに変更(文字列ベース)
@GetMapping
public String getUserList() {
return "유저 리스트 리턴";
}
@GetMapping(path = "/{userId}")
public String getUser(@PathVariable("userId") String userId) {
return "유저 리스트 중 하나 " + userId;
}
受信したidが数値の場合、以下のように変更されます.@GetMapping(path = "/{userId}")
public String getUser(@PathVariable("userId") int userId) {
return "유저 리스트 중 하나 " + userId;
}

http://localhost:8080/users/0829kujの結果.
クエリー文字列の入力
プレイヤー数が多い場合は、毎日リクエストで受け取ると非効率です.
クエリー・リストとして最小ページと最大制限をアドレスに追加するよう要求します.
- UserController -
@GetMapping
public String getUserList(@RequestParam("page") int page, @RequestParam("limit") int limit) {
return "유저 리스트 리턴 페이지: "+ page + ", limit : " + limit;
}
http://localhost:8080/users?page=1&limit=10 
正常な応答.
パラメータなしhttp://localhost:8080/users、要求時にエラーが発生しました.
defaultValue(デフォルト)を設定してエラーを防止します.
- UserController -
// 효율적으로 DB를 사용하기 위해 페이지 수와 한 페이지 당 가져올 데이터수를 지정
@GetMapping
public String getUserList(@RequestParam(value= "page", defaultValue = "1") int page,
@RequestParam(value = "limit", defaultValue = "50") int limit,
@RequestParam(value = "sort", defaultValue = "desc", required = false) String sort) {
return "유저 리스트 리턴 페이지: "+ page + ", limit : " + limit + ", 정렬 : " + sort;
}
sortのrequired=falseは、この属性がなくてもエラーが発生しないように設定されています.defaultValueが設定されていない場合、if(sort=null)sort="DESC";デフォルト値を個別に記入するために追加する必要がありますが、ここに追加されているので、必要ありません.
http://localhost:8080/users

変更前の要求エラー

defaultValueの追加後にアクセス中にエラーx
Javaオブジェクトとして返される

新しいクラスの作成
-UserRestクラス-
public class UserRest {
private String name;
private String email;
private String userId;
// get/set 자동생성
}
- UserController -@GetMapping(path = "/{userId}")
public UserRest getUser(@PathVariable("userId") String id) {
// java 객체 유저를 리턴
UserRest returnUser = new UserRest();
returnUser.setName("홍");
returnUser.setUserId(id);
returnUser.setEmail("[email protected]");
// 객체로 리턴 시 RestController에서 json으로 리턴
return returnUser;
}

http://localhost:8080/users/の後にidを入力して要求すると、入力された洪吉童情報はjsonに戻る.
=>Javaオブジェクトに戻ると、自動的にjsonタイプで応答します.
xml受信で返す
xmlとjson
リンク~2.13.2バージョン
- pom.xml -
バージョンを削除してspring自動管理>pomにします.xml>更新mavenに追加
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
</dependency>
- UserController -@GetMapping(path = "/{userId}", produces = {MediaType.APPLICATION_JSON_VALUE,
MediaType.APPLICATION_XML_VALUE})
public UserRest getUser(@PathVariable("userId") String id) {
// java 객체 유저를 리턴
UserRest returnUser = new UserRest();
returnUser.setName("홍");
returnUser.setUserId(id);
returnUser.setEmail("[email protected]");
// 객체로 리턴 시 RestController에서 json으로 리턴
return returnUser;
}
ここでmediaTypeはorgです.springframework.http.MediaType、インポート時にご注意ください.Productsプロパティを追加してメディアタイプを指定します.
xmlとjsonを同時に返すことを許可します.
再起動後に確認します.

HeaderのAccept設定をアプリケーション/xmlに変更し、再確認します.

xmlに戻ることを確認できます.
HTTP状態コード
httpステータスコードを一緒に返します.
httpステータスコード:200対正常応答、400対要求エラー、500対サーバエラー
httpステータスコードを参照
- UserController -
@GetMapping(path = "/{userId}", produces = {MediaType.APPLICATION_JSON_VALUE,
MediaType.APPLICATION_XML_VALUE})
public ResponseEntity<UserRest> getUser(@PathVariable("userId") String id) {
// java 객체 유저를 리턴
UserRest returnUser = new UserRest();
returnUser.setName("홍");
returnUser.setUserId(id);
returnUser.setEmail("[email protected]");
// 객체로 리턴 시 RestController에서 json으로 리턴
return new ResponseEntity<UserRest>(returnUser, HttpStatus.BAD_REQUEST);
}
@GetMapping("/bad")
public ResponseEntity<String> badRequest() {
return new ResponseEntity<String>("잘못된 요청", HttpStatus.BAD_REQUEST);
}
BAD REQUESTをOKに変更


POST新規ユーザーの作成

新しいクラスの作成
- UserRequest -
public class UserRequest {
private String name;
private String email;
private String password;
//getset 자동생성
}
- UserController -@PostMapping
public String getCreaterUser(@RequestBody UserRequest user) {
return "새 유저를 생성";
}
@RequestBody:実際のリクエストのデータ
postでデータが送信されることを確認
- UserController -
@PostMapping
public ResponseEntity<UserRest> getCreaterUser(@RequestBody UserRequest user) {
UserRest returnUser = new UserRest();
returnUser.setName(user.getName());
returnUser.setEmail(user.getEmail());
return new ResponseEntity<UserRest>(returnUser, HttpStatus.CREATED);
}

要求が成功したときに表示されます.
データ検証Validating Request Body
POSTを使用して入力した値を検証する
ライブラリのダウングレード pom.xmlに追加します.
以前と同様にversionラベルを削除してspringを自動的に管理します.
- UserController -
@PostMapping
public ResponseEntity<UserRest> getCreaterUser(@Valid @RequestBody UserRequest user) {
UserRest returnUser = new UserRest();
returnUser.setName(user.getName());
returnUser.setEmail(user.getEmail());
return new ResponseEntity<UserRest>(returnUser, HttpStatus.CREATED);
}
@Validを使用してuserRequestにアクセスしたユーザーを検証-UserRequestクラス-
@NotBlank(message="이름을 입력해주세요")
private String name;
@NotBlank(message="이메일을 입력해주세요")
@Email
private String email;
@NotNull(message = "패스워드를 입력해주세요")
@Size(min = 4, max = 10, message = "패스워드의 길이는 4 ~ 10 사이입니다")
private String password;
有効性をアシスタントに設定再起動後に確認します.(手動でMavenを追加する場合は、変更を適用するには再起動後に確認する必要があります)

要求が無効な場合、エラーメッセージが出力されます.
通常のリクエストの場合、上記の有効性が有効になる前の結果と同じであるため、リクエストはスキップされます.
userId子の保存
まず、DBを使用せずにリストを作成して保存します.
- UserController -
@PostMapping
public ResponseEntity<UserRest> getCreaterUser(@Valid @RequestBody UserRequest user) {
UserRest returnUser = new UserRest();
returnUser.setName(user.getName());
returnUser.setEmail(user.getEmail());
String userId = UUID.randomUUID().toString(); // 랜덤한 고유id를 만듦
returnUser.setUserId(userId);
if (users == null) users = new HashMap<>(); // 싱클톤 패턴. 선언된 map <문자열, UserRest>가 없으면 새로생성
users.put(userId, returnUser); // map이므로 (유저id, 유저객체) 를 한쌍으로 입력
return new ResponseEntity<UserRest>(returnUser, HttpStatus.CREATED);
}

postによって新しいユーザが作成されたときにランダムに作成されたuserIdは一緒に保存されます.
- UserController -
userIdを使用してユーザーを検索し、返されるように変更し、ない場合はユーザーに通知します.
@GetMapping(path = "/{userId}", produces = {MediaType.APPLICATION_JSON_VALUE,
MediaType.APPLICATION_XML_VALUE})
public ResponseEntity<UserRest> getUser(@PathVariable("userId") String id) {
// java 객체 유저를 리턴
if (users.containsKey(id)) {
return new ResponseEntity<UserRest>(users.get(id), HttpStatus.OK);
} else { // userId가 없음을 알림
return new ResponseEntity<UserRest>(HttpStatus.NO_CONTENT);
}

以前に作成したユーザのidリクエストをgetとすると、そのユーザの情報が正常に出力されます.

リクエスト時にNO CONTENTとして指定されているため、何も表示されません.
リストとして保存されているため、次のサーバでは生成したユーザが初期化され、テスト時に注意してください.
PUTユーザー情報の更新

新しいクラスの作成
- UpdateUserRequest -
public class UpdateUserRequest {
// 유저 객체에서 email을 제외한 name만 업데이트
@Size(min = 2, message = "이름의 길이는 2자 이상")
private String name;
// getset 자동생성
}
- UserController -// 업데이트 시 id를 입력 후 body에 업데이트 할 이름을 json으로 입력함
@PutMapping("/{userId}")
public UserRest getUpdateUser(@PathVariable("userId") String id,
@Valid @RequestBody UpdateUserRequest user) {
UserRest savedUser = users.get(id);
savedUser.setName(user.getName()); // 이름 수정됨
return savedUser;
}
入力したuserIdを使用してユーザーを検索します.@Valid検証を使用します.
検証が完了したnameを@RequestBodyに更新します.

DELETEユーザーの削除
- UserController -
@DeleteMapping("/{userId}")
public ResponseEntity<Void> geDeletetUser(@PathVariable("userId") String id) {
users.remove(id);
return new ResponseEntity<Void>(HttpStatus.NO_CONTENT);
}

新規ユーザ作成後に生成されたidを用いて削除要求>削除後GETでidを検索し,no contentと表示されることを確認する.
REST APIをpmaプロジェクト-1-に適用する
GETを使用した従業員の検索

新しいクラス、パッケージの作成
- EmployeeApiController -
@RestController
@RequestMapping("/app-api/employees")
public class EmployeeApiController {
@Autowired
private EmployeeRepository empRepo;
@GetMapping
public Iterable<Employee> getEmployees(){
return empRepo.findAll();
}
}
- Employee -@JsonIgnoreを追加し、無限の重複を防止
// N:N 관계에서는 테이블을 만들어 만든 테이블에 id를 넣고 다른 테이블의 id도 입력한다.
// CascadeType.PERSIST, CascadeType.REMOVE 제거
@ManyToMany(cascade = {CascadeType.MERGE, CascadeType.REFRESH, CascadeType.DETACH}, fetch = FetchType.LAZY)
@JoinTable(name = "project_employee", joinColumns = @JoinColumn(name="employee_id"),
inverseJoinColumns = @JoinColumn(name="project_id"))
@JsonIgnore // 이게 없으면 무한으로 서로 검색해서 호출함
private List<Project> projects;

http://localhost:8080/app-api/employeesを実行すると、すべての従業員のリストがjsonとして出力されます.
- EmployeeApiController -
idを使用して従業員を検索する方法を追加
@GetMapping("/{id}")
public Employee getEmployeeById(@PathVariable("id") Long id){
return empRepo.findByEmployeeId(id);
}

http://localhost:8080/app-api/employees/1を検索すると、IDの従業員情報がjsonとして出力される.
POSTで新入社員を入力
- EmployeeApiController -
// 요청하는 body에 json타입의 새 직원 데이터를 입력 시 새 직원 생성 후 그 직원을 리턴
@PostMapping(consumes = "application/json")
@ResponseStatus(HttpStatus.CREATED) // 상태 201 생성
public Employee create(@RequestBody Employee employee){
return empRepo.save(employee);
}
postmanテスト入力を使用する前にcsrf設定を閉じてください- SecurityConfiguration -
@Override
protected void configure(HttpSecurity http) throws Exception {
...
http.csrf().disable(); // REST API에서는 csrf설정을 끔
}

テスト時に新規従業員を作成し、従業員のデータを返します.
生成されたemployeeIdを検索すると、同じ結果が得られます.
ここでは、ないidとして保存する必要があるため、新入社員が格納されます.
(前回のレッスンでは、empRepo.save(従業員)のidを検索するときにupdateを使用し、そうでない場合はsaveを使用して新入社員を作成するタスクを作成しました.)
Reference
この問題について(春コース7日目), 我々は、より多くの情報をここで見つけました https://velog.io/@0829kuj/스프링수업-7일차テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol