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

2018年1月30日

 

どうも前回こちらの

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)
    }
}

みての通り
api_delete,api_create,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すれば
確認できるはずです。

以上です!!