[Spring Boot] ServletUriComponentBuilder

7891 ワード

1つの記事では、Rest APIを実装する際にServletUriComponentBuilderを使用する例をまとめた.
REST APIを実装する場合、ユーザが要求を発行すると、特定の値を含むuriを渡す必要がある場合がある.
このとき使用されるのはServletUriComponentBuilderです.ServletUriComponentBuilderによって適切なURIを作成し、特定の値を含むURIを要求されたユーザに渡すことができる.
この例は、JpaRespositoryを使用してsave()メソッドに戻った後に追加されたユーザのIDであり、追加されたユーザ情報が正しいかどうかを確認するページに追加されるURLを作成する.
しかし現在javaのURIUriComponentBuilderがあり、
@PostMapping("/signup")
	public ResponseEntity<?> registerUser(@Valid @RequestBody SignUpRequest signUpRequest) {
    

		//새로운 유저를 생성하는 부분
		User user = new User(signUpRequest.getEmail(), signUpRequest.getPassword(), signUpRequest.getNickname(),
			signUpRequest.getDomain(), signUpRequest.getIntroduce());

		user.setPassword(passwordEncoder.encode(user.getPassword()));

		Role userRole = roleRepository.findByName(RoleName.ROLE_USER)
			.orElseThrow(() -> new AppException("User Role not set."));

		user.setRoles(Collections.singleton(userRole));
        //대충 여기까지 유저 생성하는 부분
	
		User result = userRepository.save(user);
        //Jpa를 이용하여 유저를 save() 하는 부분 
        
        /**
      	컨텍스트 상대 경로 URI를 쉽게 만들게 해주는 UriComponentsBuilder를 컨트롤러 메서드의 인자로 지정
        */

		URI location = ServletUriComponentsBuilder
			.fromCurrentContextPath().path("/api/users/{user_id}")
			.buildAndExpand(result.getId()).toUri();
            
        /**
        UriComponentsBuilder와 User객체의 id로 리소스 URI를 만든다.
        path()메서드에 있는 {user_id}는 플레이스 홀더며, buildAndExpand() 메서드에 넘겨준 값으로 치환된다.
        */

		return ResponseEntity.created(location).body(new ApiResponse(true, "User registered successfully"));
        
        /**
        HTTP 응답 헤더를 설정하려면 메서드에서 User객체가 아닌 ResponseEntity객체를 반환해야한다. ResponseEntity객체에는 응답 헤더인 HttpHeaders객체, 상태 코드인 HttpStatus를 설정한다.
        */
	}
注意:静的ResponseEntity.BodyBuilderのCreate(URI location)
->CREATEDステータスとロケーションヘッダセットを持つ新しいビルダーを作成し、CREATEDステータスとロケーションヘッダを指定したURIに設定します.
結果画面localhost:8080/api/usersにPOST要求を送信してユーザを作成する.
ヘッドに入る位置を確認できます.