什么是restcall,pathcall,namedcall in lagom.javadsl.api.Descriptor;

时间:2016-10-13 13:28:36

标签: akka akka-http lagom

我是微服务和Lagom框架的新手,在我们制作ServiceCalls的服务api中,我不理解 namedcall pathcall的差异 restcall 。我们应该在何时何地使用哪个?

例如在这些电话中:

  ServiceCall<NotUsed, Cargo, Done> register();
  restCall(Method.POST, "/api/registration", register()

  ServiceCall<NotUsed, NotUsed, Source<Cargo, ?>> getLiveRegistrations();
  pathCall("/api/registration/live", getLiveRegistrations())

  ServiceCall<User, NotUsed> createUser();
  namedCall("/api/users", this::createUser)

1 个答案:

答案 0 :(得分:4)

Lagom Documentation非常清楚:

  1. 命名
  2.   

    最简单的标识符类型是名称,默认情况下,该名称设置为与实现它的接口上的方法名称相同的名称。通过将自定义名称传递给namedCall方法,也可以提供自定义名称:

    default Descriptor descriptor() {
        return named("hello").withCalls(
            namedCall("hello", this::sayHello)
        );
    }
    
      

    在这种情况下,我们将其命名为hello,而不是默认的sayHello。使用REST实现时,这意味着此调用将具有/ hello路径。

    1. 路径
    2.   

      第二种类型的标识符是基于路径的标识符。这使用URI路径和查询字符串来路由呼叫,并且可以从中提取动态路径参数。可以使用pathCall方法配置它们。

           

      通过声明路径中的动态部分,从路径中提取动态路径参数。这些以冒号为前缀,例如,/ order /:id的路径有一个名为id的动态部分。 Lagom将从路径中提取此参数,并将其传递给服务调用方法。

      ServiceCall<NotUsed, Order> getOrder(long id);
      
      default Descriptor descriptor() {
          return named("orders").withCalls(
              pathCall("/order/:id", this::getOrder)
          );
      }
      
        

      当然可以提取多个参数,这些参数将按照从URL中提取的顺序传递给您的服务调用方法:

      1. 休息电话
      2. 标识符的最终类型是REST标识符。 REST标识符旨在用于创建语义REST API。它们使用路径(如基于路径的标识符)和请求方法来识别它们。可以使用restCall方法配置它们:

        ServiceCall<Item, NotUsed> addItem(long orderId);
        ServiceCall<NotUsed, Item> getItem(long orderId, String itemId);
        ServiceCall<NotUsed, NotUsed> deleteItem(long orderId, String itemId);
        
        default Descriptor descriptor() {
        return named("orders").withCalls(
                restCall(Method.POST,   "/order/:orderId/item",         this::addItem),
                restCall(Method.GET,    "/order/:orderId/item/:itemId", this::getItem),
                restCall(Method.DELETE, "/order/:orderId/item/:itemId", this::deleteItem)
        );
        }