博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用 Postman 与 Kotlin 交互REST API接口数据
阅读量:6927 次
发布时间:2019-06-27

本文共 4725 字,大约阅读时间需要 15 分钟。

hot3.png

在前面2篇文章和介绍了如何使用简单代码快速实现REST API的服务端接口及客户端应用。

此文简单介绍如何使用Postman快速完成REST API接口的数据交互及调试工作,Postman的下载地址:

就像其主页上说明的一样,Postman能让API的开发工作更加简单高效,建议做API开发还没有用过Postman的同学尝尝鲜。

回到正题,实现数据交互,我们需要在REST API服务端实现针对不同类型HTTP请求的响应机制,其中常见的HTTP请求类型包括GET,POST,DELETE,PUT等,前面我们的接口仅实现了针对不带参数的GET类型请求的响应机制,现在我们先看看含参数的GET请求如何处理。

GET类型HTTP请求传递参数有如下2种方式,可分别通过request.pathVariable("id")或者request.queryParam("id")获取到传入的参数值:

请求路径格式参考

传参方式

Kotlin响应函数

“/get/XXX” URL路径变量 GET("/get/{id}")
{ request -> ServerResponse.ok().body(bookRepository.findById(request.pathVariable("id")))}
“/get?id=XXX” FORM表单参数 GET("/get")
{ request ->
     val id = request.queryParam("id")
     ServerResponse.ok().body(bookRepository.findById(id.get()))
}

实现以上接口函数的方法后,可以简单通过Postman提交如下2个测试请求:

两次请求获取到的结果相同,具体参考如下截图:

POST类型HTTP请求传递参数有如下2种方式,获取参数值的方法参见下表:

请求路径格式参考

传参方式

Kotlin获取参数值的方法

“/add?name=XXX” FORM表单参数 request.queryParam("name")
"/add" Request Body 获取多个同类型Java对象参数值:request.bodyToFlux(Book::class.java) 
获取单个Java对象参数值:request.bodyToMono(Book::class.java)

以上2种传参方式的区别在于FORM表单参数仅支持简单类型参数传值,而Request Body可通过JSON格式传递复杂类型数据到服务端,Spring WebFlux框架会自动将JSON格式的入参转化为指定类型的实体bean,如果传入的是多个Book类型对象的数组,可以用request.bodyToFlux(Book::class.java)将其转化为Book类型元素的Flux流再做后续处理,如果传入的是单个Book类型对象,可以用request.bodyToMono(Book::class.java)将其转化为Book类型元素的Mono流做后续处理。

以下我们声明一个RestBookHandler对象来受理来自REST API的POST请求:

@Componentclass RestBookHandler(val bookRepository: BookRepository) {    fun saveBook(request: ServerRequest): Mono
= request.bodyToMono(Book::class.java) .flatMap { bookRepository.save(it) } .flatMap { it -> ServerResponse.ok().body(fromObject(it)) }}

受理POST请求的动作分解如下:

步骤1:request.bodyToMono(Book::class.java), 将传入的Request Body 中的JSON字符串转化为Book类型的Mono流;

步骤2:flatMap { bookRepository.save(it) },保存Mono流内的Book对象;

步骤3:flatMap { it -> ServerResponse.ok().body(fromObject(it)) },将保存后的Book对象返回给调用者。

在主函数的beans框架内添加如下部分声明一个名称为postHandler的bean处理来自/add路径的POST请求,接收到的请求交给bookResthandler对象的saveBook方法进行处理:

bean("postHandler") {    val bookRestHandler = ref
() router { POST("/add", bookRestHandler::saveBook) }}

通过Postman提交如下测试请求:

请求类型 HTTP POST
请求URL http://localhost:8080/add
Request Body(JSON格式串) {
    "name":"Postman提交书籍",
    "author":"Michael Chen",
    "publish":"2018-09-11T13:49:00.000+0000"
}

服务器接受到Postman提交的请求后,正常执行相应过程返回的结果如下:

汇总以上实现的GET及POST方法,不带参数和带参数的方法,整个KotlinAppApplication.kt文件的代码如下:

@SpringBootApplicationclass KotlinAppApplicationinterface BookRepository : ReactiveMongoRepository
@Documentdata class Book(val id: ObjectId?, val name: String, val author: String, val publish: Date)fun main(args: Array
) { runApplication
(*args) { addInitializers( beans { bean("postHandler") { val bookRestHandler = ref
() router { POST("/add", bookRestHandler::saveBook) } } bean { val bookRepository = ref
() val interval = Flux.interval(Duration.ofMillis(100)) router { (accept(TEXT_HTML) and "/book").nest { GET("/list") { ServerResponse.ok().contentType(MediaType.TEXT_EVENT_STREAM) .body(Flux.zip(interval, bookRepository.findAll()).map { entry -> entry.t2 }) } GET("/get/{id}") { request -> ServerResponse.ok().body(bookRepository.findById(request.pathVariable("id"))) } GET("/get") { request -> val id = request.queryParam("id") ServerResponse.ok().body(bookRepository.findById(id.get())) } } } } bean { val bookRepository = ref
() ApplicationRunner { bookRepository.deleteAll() .thenMany(Flux.fromStream(Stream.generate { ObjectId.get() }.limit(10))) .map { Book(it, "Spring 空间", "Michael Chen", Date()) } .flatMap { bookRepository.save(it) } .thenMany(bookRepository.findAll()) .subscribe { println(it) } } } } ) }}

通过以上样例可以看出,在结合Kotlin和Spring Boot 2.0的基础上,开发一个REST API接口可以有更多灵活的方案,而不用拘泥于@RestController的方式。

以上示例代码下载地址:

转载于:https://my.oschina.net/cbcgorilla/blog/2049634

你可能感兴趣的文章
Spring jdbcTemplate查不到数据时抛出EmptyResultDataAccessException
查看>>
说说C#委托
查看>>
js实现相册-by小雨
查看>>
jQuery 语法
查看>>
jQuery $.get $.post $.getJSON 详解【转发】
查看>>
5种实现垂直居中css
查看>>
codefroce D. Powerful array[初识块状数组]
查看>>
使用DDMS中的内存监测工具Heap来优化内存
查看>>
做移动端视频通话软件,大致看了下现有的开源软件(转)
查看>>
【转】C 宏
查看>>
游戏框架设计中的。绑定binding。。。命令 command 和消息message 以及MVVM
查看>>
在地图中使用Java
查看>>
八大排序算法
查看>>
GCD之定时器dispatch_source_t(转载暂时未完全理解)
查看>>
11、final详解
查看>>
使用onclick跳转到其他页面/跳转到指定url
查看>>
前端模块化思考
查看>>
Android Studio下jni应用
查看>>
hdu 2795 Billboard 线段树单点更新
查看>>
史上最简单的Hibernate入门简单介绍
查看>>