首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Ratpack:构建简单高效的 HTTP 微服务(2)基本的 HTTP 处理

Ratpack:构建简单高效的 HTTP 微服务(2)基本的 HTTP 处理

基本的 HTTP 处理在开发 HTTP 微服务时,某些基本的操作是不可或缺的。Ratpack 也通过 Request 和 Response 接口对这些操作提供了支持。
表单和文件上传表单处理是 HTTP 应用中的一个重要内容。一般的 HTML 表单提交时的内容类型是 application/x-www-form-urlencoded。当有文件上传时,使用的是 multipart 的内容格式。代码清单演示了一般的表单处理和文件上传。基本的做法是使用 Context 接口的 parse 方法把请求内容解析成 Form 接口的对象。对于一般的表单元素,使用 Form 接口的 get 方法可以获取到给定名称的元素的值;对于上传文件,通过 file 方法来获取到给定名称的 UploadedFile 接口对象。通过 UploadedFile 接口可以读取文件的内容。   中直接把上传文件的文本内容返回给客户端。
清单 2. 表单和文件上传
1
2
3
4
5
6
7
8
9
RatpackServer.start(server -> server
.handlers(chain -> chain.post("form",
   ctx -> ctx.parse(Form.class)
     .then(form -> ctx.render(form.get("name")))
   ).post("file", ctx ->
     ctx.parse(Form.class).then(form -> ctx.render(form.file("file").getText()))
   )
)
);




JSON 请求和响应HTTP 微服务通常使用 JSON 作为数据的传输格式,因此需要对 JSON 格式的请求内容进行解析,并且生成 JSON 格式的响应。解析 JSON 请求内容同样需要使用 Context 接口的 parse 方法;而生成 JSON 响应,也是使用 Context 接口的 render 方法。Ratpack 的 JSON 支持使用的是 Jackson 库,支持 POJO 对象和 JSON 格式之间的转换。
在   中,通过 Jackson 类的 fromJson 方法可以把 HTTP 请求内容转换成 User 类的对象。当需要生成 JSON 响应时,只需要用 Jackson 类的 json 方法包装 User 类的对象即可。
清单 3. JSON 请求和响应
1
2
3
4
5
6
7
8
9
RatpackServer.start(server ->
server.handlers(chain ->
chain.post(ctx -> {
  ctx.parse(fromJson(User.class))
    .map(user -> new User(user.getId(), user.getName().toUpperCase()))
    .then(user -> ctx.render(json(user)));
})
)
);




静态文件在 HTTP 微服务开发中,可能会需要直接发送磁盘上的静态文件,如 HTML、JavaScript、CSS 和图片文件等。Ratpack 提供了对静态文件的直接支持,可以很方便的把某个目录暴露为静态资源。在   中,使用 Chain 接口的 files 方法来声明静态资源的特征,即目录是 public,首页文件是 index.html。在启动 Ratpack 服务器时,需要配置服务器的根目录。这是通过 baseDir 方法来设置的。files 方法中的静态资源声明中的路径都是相对于该根目录的。
清单 4. 静态文件处理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class StaticFiles {
public static void main(String[] args) throws Exception {
Path baseDir = Paths.get("app").toAbsolutePath();
new StaticFiles().start(baseDir);
}

public void start(final Path baseDir) throws Exception {
RatpackServer.start(server -> server
  .serverConfig(c -> c.baseDir(baseDir))
  .handlers(chain -> chain
    .files(f -> f.dir("public").indexFiles("index.html"))
  )
);
}
}




Ratpack 的静态文件支持提供了基于文件修改时间的 ETag 头,以及 GZIP 的支持。但是相比于 Apache 和 Nginx 来说,所提供的功能还是很弱。因此 Ratpack 的静态文件支持一般用在开发和测试环境中,并不适合直接在生产环境中使用。
除了直接暴露静态文件目录之外,还可以在处理器中通过 Response 接口的 sendFile 来发送文件作为响应。
HTTP 头Request 和 Response 接口都提供了 getHeaders 方法来获取到 HTTP 头,不过 Request 接口的 getHeaders 方法返回的是不可变的 Headers 接口对象,而 Response 接口的 getHeaders 方法返回的是可变的 MutableHeaders 接口对象。Headers 接口中的 get 和 getAll 方法可以根据名称获取 HTTP 头的值。MutableHeaders 接口提供了 add、set 和 remove 方法来对 HTTP 头进行修改。
   中获取了 HTTP 请求中 X-UID 头的内容,并作为 HTTP 响应的内容发送回来。
清单 5. HTTP 头处理
1
2
3
4
5
6
7
8
9
RatpackServer.start(server ->
server.handlers(chain ->
chain.get(ctx -> {
  String userId = ctx.getRequest().getHeaders().get("X-UID");
  ctx.getResponse().getHeaders().set("X-Poweredby", "Ratpack");
  ctx.render(userId);
})
)
);




CookieCookie 也是 HTTP 处理中的重要部分。Request 接口中的 getCookies 方法可以获取到全部 Cookie 的集合,oneCookie 方法可以根据名称获取某个 Cookie 的值。Response 接口的 cookie 方法用来创建一个 Cookie。
   中使用 Request 接口的 oneCookie 方法来读取 Cookie 的值,使用 Response 接口的 cookie 方法来设置 Cookie 的值。
清单 6. Cookie 处理
1
2
3
4
5
6
7
8
9
RatpackServer.start(server ->
server.handlers(chain ->
chain.get(ctx -> {
  String userId = ctx.getRequest().oneCookie("userId");
  ctx.getResponse().cookie("userId", "value");
  ctx.render(userId);
})
)
);

返回列表