原 荐 使用 Postman 与 Kotlin 交互REST API接口数据

栏目: 编程工具 · 发布时间: 6年前

内容简介:在前面2篇文章此文简单介绍如何使用Postman快速完成REST API接口的数据交互及调试工作,Postman的下载地址:就像其主页上说明的一样,Postman能让API的开发工作更加简单高效,建议做API开发还没有用过Postman的同学尝尝鲜。

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

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

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

原 荐 使用 Postman 与 Kotlin 交互REST API接口数据

回到正题,实现数据交互,我们需要在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个测试请求:

http://localhost:8080/book/get/5b976f860dded66908723462

http://localhost:8080/book/get?id=5b976f860dded66908723462

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

原 荐 使用 Postman 与 Kotlin 交互REST API接口数据

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请求:

@Component
class RestBookHandler(val bookRepository: BookRepository) {
    fun saveBook(request: ServerRequest): Mono<ServerResponse> = 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<RestBookHandler>()
    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提交的请求后,正常执行相应过程返回的结果如下:

原 荐 使用 Postman 与 Kotlin 交互REST API接口数据

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

@SpringBootApplication
class KotlinAppApplication

interface BookRepository : ReactiveMongoRepository<Book, String>

@Document
data class Book(val id: ObjectId?, val name: String, val author: String, val publish: Date)

fun main(args: Array<String>) {
    runApplication<KotlinAppApplication>(*args) {
        addInitializers(
                beans {

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

                    bean {
                        val bookRepository = ref<BookRepository>()
                        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<BookRepository>()
                        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://gitee.com/chenbichao/kotlin-app


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Pro Django

Pro Django

Marty Alchin / Apress / 2008-11-24 / USD 49.99

Django is the leading Python web application development framework. Learn how to leverage the Django web framework to its full potential in this advanced tutorial and reference. Endorsed by Django, Pr......一起来看看 《Pro Django》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具