2.2 API 与控制器
在上一节中,我们介绍了应用的启动、环境相关等基础信息,但这个应用只是个空架子,不能提供任何响应。作为一个 Web 应用,对外交互的途径主要是通过 Http API。
类似于 Spring Boot 框架,Micronaut 框架也采用了注解的方式来标记哪些类、哪些函数是 API 的入口函数,并且在设计时,Micronaut 框架参加了 Spring Boot 框架的注解设计,让使用者尽量保持编码习惯的一致性。
Micronaut 框架中用于标记 API 入口的控制器类的注解为 @Controller,与 Spring Boot 框架名字一致,而 Http 方法的注解略有差异,整理了部分注解对比,见表 1。
表 1
| 注解说明 | Spring Boot | Micronaut |
|---|---|---|
| 控制器 | @Controller / @RestController | @Controller |
| Get 方法 | @GetMapping | @Get |
| Post 方法 | @PostMapping | @Post |
我们基于上一篇的 demo 项目 “firstdemo”,继续添加控制器实现。
Controller
我们先创建一个控制器类 HelloController,然后我们为这个类添加注解 @Controller,代码示例如下:
package fun.mortnon.demo;
import io.micronaut.http.annotation.Controller;
/**
* @author dev2007
* @date 2023/3/24
*/
@Controller
public class HelloController {
}
@Controller 的默认路径为 /,默认 http 响应中 Content-Type 为 application/json。
然后我们添加一个 /hello 的 API,http 方法为 Get,函数名为 hello() 代码如下:
package fun.mortnon.demo;
import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Get;
/**
* @author dev2007
* @date 2023/3/24
*/
@Controller
public class HelloController {
@Get("/hello")
public String hello(){
return "hello world";
}
}
以上代码表明,@Controller 的默认路径 / 结合 /hello,表明 hello() 的完整 API 为 /hello,http 响应中 Content-Type 为 application/json。我们成功运行项目后,调用 /hello,http 响应会响应一个字符串 hello world。如图 1。
图 1
Content-Type
以上,我们成功开发了一个名为 /hello 的 API,但我们还是使用浏览器进行了验证,我们接着将使用 Postman 工具进行 API 的测试和验证,如果没有特别说明使用浏览器,则默认使用 Postman。Postman 的官方下载地址为 https://www.postman.com/downloads/ 。
我们打开 Postman,输入 API `,方法选择 Get`,点击 “Send” 后,结果如图 2:
图 2

从图中可以看到,/hello 的响应结果与浏览器一致,然后我们观察响应头,如图 3:
图 3

从以上可以看到,响应头中 Content-Type 确实为默认的 application/json。虽然我们定义的 hello() 响应的一个纯文本,纯文本在 application/json 下是不会报错的,但始终不是很合适,我们尝试一下适合纯文本的类型 text/plain,代码如下:
package fun.mortnon.demo;
import io.micronaut.http.MediaType;
import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Get;
import io.micronaut.http.annotation.Produces;
/**
* @author dev2007
* @date 2023/3/24
*/
@Controller
public class HelloController {
@Get("/hello")
@Produces(MediaType.TEXT_PLAIN)
public String hello(){
return "hello world";
}
}
以上代码中,我们为函数 hello() 增加了一个注解 @Produces,同时为它指定一个枚举 MediaType.TEXT_PLAIN,该枚举对应的即为 text/plain。我们重新运行项目,并再次访问 /hello,然后切换到响应头,如图 4:
图 4

可以看到响应头中 Content-Type 变更为了 text/plain。Micronaut 中定义的更多的类型值,可以查看类 io.micronaut.http.MediaType 中的定义。
另外还需要注意在 @Controller 中有一个属性 produces,可以为整个控制器指定 Content-Type 类型。
Http 方法
在以上的示例中,我们使用了注解 @Get 标识该 API 为接受 Get 方法的 http 请求。类似的,Micronaut 还提供了很多 http 方法,如表 2:
表 2
| 注解 | 方法 |
|---|---|
@Delete | Delete |
@Get | Get |
@Head | Head |
@Options | Options |
@Patch | Patch |
@Post | Post |
@Put | Put |
@Trace | Trace |
以上这些 http 方法中,我们如果使用 Restful API 风格,常用的方法主要是 @Delete、@Get、@Patch、@Post 和 @Put。
我们尝试增加一个 Post 方法的 API /echo,函数名为 echo(String txt),它将接收我们传递的一个字符串,然后添加一个“response:”后,响应回来,代码如下:
@Post("/echo")
@Consumes(MediaType.TEXT_PLAIN)
public String echo(String txt) {
return "response:" + txt;
}
由于我们接收参数考虑为纯文本,所以我们为函数增加了一个注解 @Consumes(MediaType.TEXT_PLAIN),标明这个函数的参数 String txt 的数据来源于 API /echo 传入的请求体。我们重新运行项目,然后访问 API /echo,如图 5:
图 5

可以看到,响应体符合函数的设计。
小结
本节我们初步了解了 Micronaut 针对控制器中 http 方法及请求体和响应体中 Content-Type 相关的注解,并能初步开发出可用的 API。