基于HTTP的REST服务
一个REST HTTP服务由一系列REST API组成,每个API会包括以下两个要素:
- API描述,比如:GET /usrs/,描述这个API使用GET方法查询指定用户的信息。
- API处理器。包含了这个API具体的实现逻辑。
一个HTTP API的处理流程大概是,HTTP服务器收到HTTP请求,解析出HTTP中的URL,获取到URL中的API PATH及HTTP方法。然后将这个API路由到指定的API处理器,进而获取到响应值,然后HTTP服务器将响应封装为HTTP响应发回给客户端。
如何开发一个akka http REST服务?
这里对官方给的一个例子进行分析:https://developer.lightbend.com/guides/akka-http-quickstart-java/
这个例子里面,定义了几个api:
POST /users
GET /users
GET /users/<id>
DELETE /users/<id>
在akka http中,使用Route来封装api及对应的处理器。这里是定义对应Route的代码:
public Route userRoutes() {
//定义所有api前缀为: /users
return pathPrefix("users", () ->
//concat会将多个Route聚合在一起,表示这些Route都会参与/users这个path段的匹配
concat(
//pathEnd表示全路径匹配,这意味着不能匹配“/users/”这样的路径
pathEnd(() -> concat(
//匹配GET /users, 处理器是getUsers()
get(() -> onSuccess(getUsers(), users -> complete(StatusCodes.OK, users, Jackson.marshaller()))),
//匹配POST /users, 这里将客户端的请求body解析为User对象, 然后交给createUser去使用, performed是createUser的返回值
post(() -> entity(Jackson.unmarshaller(User.class), user -> onSuccess(createUser(user), performed -> {
log.info("Create result: {}", performed.description);
return complete(StatusCodes.CREATED, performed, Jackson.marshaller());
}))))),
// 如果请求是/users/Bill, PathMatchers.segment()会以“/”为分隔符解析出第二个path段Bill,
// 交给concat聚合的路由进一步匹配
path(PathMatchers.segment(), (String name) -> concat(
//匹配GET /users/<name>, 处理器是getUsers(name)
get(() -> onSuccess(getUser(name), performed -> {
log.info("Get User: {}", performed.maybeUser.toString());
if (performed.maybeUser.isPresent()) {