akka http使用demo

基于HTTP的REST服务

一个REST HTTP服务由一系列REST API组成,每个API会包括以下两个要素:

  1. API描述,比如:GET /usrs/,描述这个API使用GET方法查询指定用户的信息。
  2. 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()) {                                                          
           
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值