header image
header image

Kotlin + Spring Boot で Web APIを作成してみる。 ~その②~

Kotlin + Spring Boot で Web APIを作成してみる。 ~その②~

 

どうも前回こちらの

Kotlin + Spring Boot で Web APIを作成してみる。 ~その①~ 記事でWeb APIをKotlin+Spring Bootで 作ってみるということをしてみました。

 

が、

前回は、 CRUDでいう所のRの部分しかAPIとして 提供できていなかったので、 今回はCRUDの全てのメソッドを備えたRESTfulなAPI を目指して前回のリポジトリをブラッシュアップしました。

 

 

RESTFulなAPIにブラッシュアップ

@Controller
class BookController @Autowired constructor(private val bookService: BookService) {

    @RequestMapping("/books")
    fun index(): ModelAndView = ModelAndView("/book/index").apply { addObject("books", bookService.findAllBook()) }

    @RequestMapping("/api/books")
    fun api_index(): ResponseEntity<MutableList> {
        return ResponseEntity.ok(bookService.findAllBook())
    }
    @RequestMapping("/api/books/{id}")
    fun api_show(@PathVariable("id") id : Int): ResponseEntity {
        return ResponseEntity.ok(bookService.findById(id))
    }

}

 

@Controller
class BookController @Autowired constructor(private val bookService: BookService) {

    @RequestMapping("/books")
    fun index(): ModelAndView = ModelAndView("/book/index").apply { addObject("books", bookService.findAllBook()) }

    @RequestMapping("/api/books")
    fun api_index(): ResponseEntity<MutableList> {
        return ResponseEntity.ok(bookService.findAllBook())
    }

    @RequestMapping("/api/books/{id}")
    fun api_show(@PathVariable("id") id : Int): ResponseEntity {
        return ResponseEntity.ok(bookService.findById(id))
    }

    @RequestMapping("/api/books", method = arrayOf(RequestMethod.PUT))
    fun api_update(@RequestBody book: Book): ResponseEntity{
        return ResponseEntity.ok(bookService.save(book))
    }

    @RequestMapping("/api/books", method = arrayOf(RequestMethod.POST))
    fun api_create(@RequestBody book: Book): ResponseEntity {
        return ResponseEntity.ok(bookService.save(Book( book.id, book.name,book.author,book.isbn)))
    }

    @RequestMapping("/api/books/{id}",method = arrayOf(RequestMethod.DELETE))
    fun api_delete(@PathVariable("id") id : Int):ResponseEntity{
        var book:Book = bookService.findById(id)
        if(book != null){
            bookService.delete(book)
        }
        return ResponseEntity.ok(book)
    }
}

みての通り apidelete,apicreate,api_updateがメソッド として追加され、 HTTPをもとにして、データの更新・削除・作成・参照ができるように なりました。

 

 

そのほかの変更について

 

 

今回は新たに更新・削除・作成 のメソッドを追加したので、 serviceについても変更を加えています。

変更点は、 以下のようで

/**
 * DBからのデータ取得と加工を行う.
 */
@Service
open class BookService @Autowired constructor(private val bookRepository: BookRepository) {

    /**
     * 全ユーザリストの取得
     * @return ユーザリスト
     */
    fun findAllBook(): MutableList = bookRepository.findAll()
    fun findById(id:Int): Book{
        var book: Book = bookRepository.findById(id)
        return book
    }

    fun exists(id: Long) : Boolean{
        return bookRepository.exists(id)
    }

    fun save(book:Book){
        bookRepository.save(book)
    }

    fun delete(book:Book){
        bookRepository.delete(book)
    }
}

今回追加したメソッドは、 save,exixts,deleteなどになりますが、 そのほとんどがBookRepositoryクラスに宣言されている メソッドを利用しました。

前回の記事をアップした際にここまではほぼ80%完成している と思っていたのですが、 createの部分がいかんせんうまくいきませんでした。

今でもなんでこんなことでスタックしてたんだろう・・・ と思うくらい簡単なことだったのですが、 前回公開した記事のsqlだとcreateができないので再掲します

create table if not exists books (
  id int primary key auto_increment,
  name varchar(255),
  author varchar(255),
  isbn varchar(255),
  category_id int,
  created_at datetime,
  updated_at datetime
);

delete from books;
insert into books
VALUES( 1 , '多動力' ,'堀江貴文', '9784344031159', 1 , NOW() , NOW()),
( 2 , 'キングダム47巻' ,'原泰久', '9784088907017', 2 , NOW() , NOW()),
( 3 , '深夜特急〈1〉香港・マカオ (新潮文庫)' ,'沢木耕太郎', '9784101235059', 3 , NOW() , NOW());

はい、 驚くことにエラーの出ていた原因はテーブルの主キーに オートインクリメントをつけていなかった為でした。。

とにもかくにも RESTfulなAPIは作成できましたので、 ここにレポジトリを晒しておきます。 https://github.com/version-1/kotlin-api-sample-

クローンして、GET,PUT,POST,DELETEすれば 確認できるはずです。

以上です!!