返回介绍

HTTP 请求

发布于 2020-07-24 21:05:46 字数 5538 浏览 1337 评论 0 收藏 0

Blade 支持注解的方式或者使用 Request 对象获取请求信息。

表单参数

先看看 Request 提供的操作表单参数的API

  • Optional<String> query(String name)
  • Optional<Integer> queryInt(String name)
  • Optional<Long> queryLong(String name)
  • Optional<Double> queryDouble(String name)
  • String query(String name, String defaultValue)
  • int queryInt(String name, int defaultValue)
  • long queryLong(String name, long defaultValue)
  • double queryDouble(String name, double defaultValue)

这几组API非常的清晰明了,因为使用了 Java8,有一组里面用了 Optional 的写法,为了让大家拿不到值的时候进行判断或其他处理,其实和带 defaultValue 的API是差不多的,因为 Optional 提供一个 orElse 方法让你设置默认值。怎么用呢?其实只要API设计的到位大家十有八九都可以猜到怎么用的,我能告诉你的是这组 API 获取的是 Form 表单的参数。

curl \
  -X POST \
  http://localhost:9000/save \
  -d 'username=Jack'
@PostRoute("/save")
public void formParams(@Param String username){

}
@PostRoute("/save")
public void formParams(Request request){
    String username = request.query("username", "默认值");
}
  • 获取 Integer 数据: request.queryInt("xxx")
  • 获取 Long 数据: request.queryLong("xxx")
  • 获取 Double 数据: request.queryDouble("xxx")

JSON数据

curl \
  -X POST \
  http://localhost:9000/users \
  -H 'Content-Type: application/json' \
  -d '{"name":"biezhi","email":"[email protected]"}'
public class User {
    private String name;
    private String email;
    // getter setter 省略
}

@PostRoute("/users")
public void bodyParams(@BodyParam User user){
    
}
@PostRoute("/users")
public void bodyParams(Request request){
    String bodyString = request.bodyToString();
}

Restful 参数

我们经常也会用到 REST 接口,一般它的URL形如:http://www.exmaple.com/users/128

这时候我们在 Blade 中定义的路由 Path 是 /users/:id,如何获取这个 id 呢,下面的API可以帮到你

  • String pathString(String name)
  • String pathInt(String name)
  • String pathLong(String name)
Integer userId = request.pathInt("id");

这样就可以获取到 userId,其他变量的获取方式相应你闭着眼睛都可以猜到。

也可以使用注解的方式

@GetRoute("/user/:uid")
public void user(@PathParam Integer uid){

}

数据绑定

Blade 支持将参数绑定到某个模型对象上,你可以像这样使用

public class User {
    private String name;
    private String email;
    // getter setter 省略
}

@PostRoute("/users")
public void bodyParams(User user){
    
}

此时接收的表单参数或者 Request BodyJSON 参数会被自动映射为一个 User 对象。

自定义绑定

如果你想自定义的绑定数据,比如像 ruby 那样在 input 文本框中指定某类名称才被匹配, 可以像这样:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <form>
        <input type="text" name="user[name]"/>
        <input type="text" name="user[age]"/>
    </form>
</body>
</html>
@PostRoute("/save")
public void customBind(@Param("user") User user){

}

读取头信息

依然看API,虽然我一直在重复看 API,因为框架编写的 API 就是为了给用户提供便捷。

  • Map<String, String> headers()
  • String header(String name)
  • String header(String name, String defaultValue)
  • boolean isIE()
  • boolean isAjax()
  • String contentType()
  • String userAgent()

上面的 API 除了给出获取 header 的方法,也提供了常用的几个附件方法,用于获取是否是IE浏览器、是否是Ajax请求、ContentType 以及 UserAgent。

读取 Cookie

  • Map<String, String> cookies()
  • Optional<Cookie> cookieRaw(String name)
  • String cookie(String name, String defaultValue)

这里的几个方法介绍一下,第一个是获取所有的 Cookie,map 的 key 是 cookie名,value 是 cookie值;第二个方法根据名称获取 cookie,这里可以获取到 cookie 的详细信息,包括 path、有效期等;最后一个方法根据名称获取 cookie,获取不到则设置一个默认值。

设置数据

很多时候我们都会用模板引擎,即便你没用过至少也知道JSP,我们会在 Request 作用域中设置一些数据,然后在模板中获取。在 Blade 中也是如此,API也很简单。

  • attribute(String name, Object value)
  • T attribute(String name)

这里第一个方法是像 Request 域设置一个数据,第二个方法从 Request 域获取一个数据,至于这里设置的数据在前端如何使用取决于你的模板引擎是哪个,根据其语法而来,比如默认的模板引擎非常简单,我们举个例子:

request.attribute("name", "blade2.0");

在我们的模板中(存储在 /resources/templates 之下的视图文件)

<h1>这是 ${name}</h1>

操作 Session

  • request.session()
Session session = request.session();
// 写入 session
session.attribute("LOGIN_USER", user);

// 读取 session
String hello = session.attribute("hello");

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文