第3章 核心概念 - 3.2 响应

优质
小牛编辑
133浏览
2023-12-01

前面的一个章节讲解了请求的用法,本章节来看看 Response 响应对象。我们都知道从浏览器访问一个网址浏览器就会向我们返回一个响应。

打开 www.baidu.com 从浏览器的开发者工具里可以看到一个响应是这样的:

3.2 响应 - 图1

那么我们在编写 web 应用的时候通常会用到 响应 相关的哪些API呢?我举几个例子你就明白了。

返回一个页面

前面我们已经做了一个简单的登录功能,在这个功能中我们已经做到了访问一个 URL 可以看到 HTML 页面的过程。
你去查看代码只有一行。

  1. @GetRoute("login")
  2. public String login() {
  3. return "login.html";
  4. }

那么框架是怎么做的呢? Blade 将模板默认都存放在 classpath 下的 templates 目录中,当我们编写一个路由的时候返回值是 StringModelAndView 类型则框架会帮你渲染到对应的视图页面,所以上面代码片段中访问 /login 会跳转到 templates/login.html 页面。

当然除了上面的方式,返回一个页面还有一种做法:

  1. @GetRoute("login")
  2. public void login(Response response) {
  3. response.render("login.html");
  4. }

这两个代码片段达到的效果是相同的,随你爱好。

返回JSON数据

很多时候我们会开发一些web api程序,返回 json 格式的数据,在 Blade 中更是方便,怎么做呢?

  1. @GetRoute("users")
  2. public void users(Response response) {
  3. List<String> users = Arrays.asList("jack", "tom", "biezhi");
  4. response.json(users);
  5. }

没错,就是这么 easy,有同学说只能这样吗?我连 response.json(users) 都不想写。。。好吧,果然程序猿都是偷懒才聪明的。还有一种方式,像 SpringMvc

  1. @GetRoute("users")
  2. @Json
  3. public List<String> users() {
  4. return Arrays.asList("jack", "tom", "biezhi");
  5. }

这里使用 @JSON 注解标识当前的路由返回一定是一段 json 数据,返回值框架会帮你处理。我们访问浏览器得到的将是:

  1. ["jack", "tom", "biezhi"]

设置Cookie

Cookie 是我们web开发中常用的一个技术,通常用于 记住我 等操作。在 Blade 中向浏览器写入 Cookie 也是使用 Response 对象完成的,来看看吧。

  1. response.cookie("c1", "value1");

这样就向当前域下写入了一个永不过期的 Cookie 数据,名称为 c1 数据为 value1。可以打开浏览器的开发者工具看到。

当然上面的写法是写最简单的 Cookie,但很多时候我们需要定制化,这时候可以看看 Response 对象里 Cookie 相关的API了。

  • Response removeCookie(String name)
  • Response cookie(Cookie cookie)
  • Response cookie(String name, String value)
  • Response cookie(String name, String value, int maxAge)
  • Response cookie(String name, String value, int maxAge, boolean secured)
  • Response cookie(String path, String name, String value, int maxAge, boolean secured)

还挺多的吗,一个比一个长呢。。是的,看到这些API大概都清楚怎么使用了。第一个是移除一个 Cookie 的,后面都是写入一个 Cookie 的方法。具体解释都可以在源码注释中看到。

返回文本/html

返回文本/html也非常的简单,Blade 提供了两个API帮你完成返回文本和html。

  • void text(String text)
  • void html(String html)

只需要将响应给客户端的字符串传递即可。

重定向

有时候我们会希望做完某个操作后重定向到另一个页面,在HTTP中其实就是 302 状态码干的。比如登录后后台直接跳转到登录成功的页面。

  1. @PostRoute("login")
  2. public void doLogin(Response response) {
  3. response.redirect("/index");
  4. }

其他操作

Response 中还有一些其他不常用的操作,我们来看看它的API

  • Response status(int status)
  • Response notFound()
  • Response contentType(String contentType)
  • Map<String, String> headers()
  • Response header(String name, String value)
  • Map<String, String> cookies()
  • void json(String json)
  • void body(@NonNull byte[] data)
  • void download(String fileName, File file) throws Exception

好了,各位看官,关于 Response 响应的介绍就到这里,我们下次来讲 Blade 中的 IOC 容器。