【问题标题】:Multiple Entity arguments in Google Cloud EndpointsGoogle Cloud Endpoints 中的多个实体参数
【发布时间】:2013-03-16 14:30:23
【问题描述】:

如何将多个实体从客户端传递到 Google Cloud Endpoint?

例如,传递单个实体很容易在服务器的 Endpoint api 源文件中完成:

public class SomeEndpoint {
...
   @ApiMethod(...)
   public MyEntity someMethod(MyEntity someEntity) {
   ...
   }
...
}

然后在客户端我可以轻松调用

endpoint.someMethod(someEntity).execute()

但是,如果我想将两个实体传递给端点怎么办?像这样:

 @ApiMethod(...)
 public MyEntity otherMethod(MyEntity someEntity, MyEntity someOtherEntity) {
    ...
 }

这不起作用,GPE 只生成一个带有单个 MyEntity 参数的端点库。

是否可以传递多个实体参数?

谢谢。

【问题讨论】:

  • 难道不能将两个拆分实体中的不同字段组合成一个实体本身吗?在您的服务器代码中,您可以获取单个实体并以不同方式处理 2 类字段。
  • 谢谢@tony。是的,我想我可以创建一个以某种方式将两者结合起来的新实体,但我试图避免这种情况。我也想知道端点在这方面的局限性。

标签: google-cloud-endpoints


【解决方案1】:

您不能在请求正文中发送多个实体类型。您需要创建一个包含这两个实体的包装实体,例如:

class MyWrapperEntity {
  MyEntity someEntity;
  MyOtherEntity someOtherEntity;
  // ...
}

但是,这不是您的示例所显示的(实体是同一类型)。在集合实体中使用List<MyEntity>Map<String, MyEntity>,例如:

class MyEntityCollection {
  List<MyEntity> items;
  // ...
}

【讨论】:

  • 谢谢丹。我尝试了这一点,因为我使用了两个相同类型的实体,并且 Eclipse 允许使用 List 构建它,但是生成的 Endpoint API 中的结果方法根本没有参数。它会忽略 List,如果您有多个 MyEntity,它会忽略第一个 MyEntity 之后的任何内容。
  • Dan,你还是在本质上建议我创建一个“包装器”实体来解决这个问题吗?如果是这样,我不清楚如何创建一个包装多个实体的 AppEngine 实体。
  • 什么不清楚?实体是对象。 Endpoint 方法在主体中最多接受一个实体(尽管该实体本身可能具有对象或标量类型的属性)。我提供的两个例子都证明了这一点。
  • 是的,我把这个问题与在数据存储中存储包含多个实体的实体混淆了,但正如您所指出的,这不是这里的问题。您可以像显示的那样简单地创建一个包装器实体,然后在端点服务中删除任何必要的内容,然后根据需要单独存储它们。
  • 由于此限制,因此不将多个实体传递给 API 方法是否是更好的数据存储 API 建模实践?是否应该努力创建一种可以避免这种情况的数据存储模型?
【解决方案2】:

使用“命名”注释...

@ApiMethod(name = "sendStuff")
public void sendStuff( @Named("clientId") String clientId, @Named("stuff") String stuff )

对于 android,客户端代码如下所示

SendStuff sl = service.sendStuff( clientId, stuff );

【讨论】:

  • 谢谢。是的,您当然可以使用 String 和 Long 等原始类型来做到这一点,但我的问题是使用多个实体作为参数。 @Named 不适用于这些。
猜你喜欢
  • 2016-04-25
  • 1970-01-01
  • 2017-01-07
  • 1970-01-01
  • 2018-12-18
  • 1970-01-01
  • 2013-05-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多