原 荐 使用 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


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

查看所有标签

猜你喜欢:

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

未来简史

未来简史

[以色列] 尤瓦尔·赫拉利 / 林俊宏 / 中信出版集团 / 2017-2 / 68.00元

进入21世纪后,曾经长期威胁人类生存、发展的瘟疫、饥荒和战争已经被攻克,智人面临着新的待办议题:永生不老、幸福快乐和成为具有“神性”的人类。在解决这些新问题的过程中,科学技术的发展将颠覆我们很多当下认为无需佐证的“常识”,比如人文主义所推崇的自由意志将面临严峻挑战,机器将会代替人类做出更明智的选择。 更重要的,当以大数据、人工智能为代表的科学技术发展的日益成熟,人类将面临着从进化到智人以来z......一起来看看 《未来简史》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具