【问题标题】:How do I access "fields" field of API Explorer from Java Google Cloud Endpoint handler?如何从 Java Google Cloud Endpoint 处理程序访问 API Explorer 的“字段”字段?
【发布时间】:2014-02-11 23:04:11
【问题描述】:

我想允许我的端点的客户端屏蔽我的 Web 服务将返回的字段。我注意到 Google API 资源管理器中有一个“字段”字段,看起来似乎是针对此功能的。但是,我找不到任何关于如何从我的 Java Endpoints 处理程序方法访问“字段”以执行客户端的愿望并返回减少的数据集的文档。这是受支持的功能吗?如果是这样,我该如何利用它?

【问题讨论】:

    标签: java google-app-engine google-cloud-endpoints


    【解决方案1】:

    由于没有找到关于这个 fields 参数的文档,我不得不从我自己的实验中说出来。

    据我了解,Google Cloud Endpoints 调度程序会自动执行该字段屏蔽。从您的 API 方法返回的对象由 Jackson JSON 解析器处理,该解析器仅返回 fields 参数中给出的字段。您对象的字段也应该出现在字段编辑器中。

    下图是该字段编辑器在 Drive API 中的显示方式。您自己的 Endpoints API 应该生成同样的字段编辑器,Jackson 应该只解析您选择的字段。

    注意事项:

    • Appengine 开发服务器 (localhost) 也显示该字段编辑器,但在解析为 JSON 时不知何故不考虑选定的字段。
    • 在某些情况下,字段编辑器允许您选择嵌套对象中的字段,在某些情况下则不允许。我还没有发现这种行为背后的逻辑。
    • 如果使用带有延迟获取字段的 Hibernate(或其他类似框架),您可能会遇到 “无法初始化代理” -错误。在这些情况下,您必须在 Endpoints 中手动打开 Hibernate 会话。我找到的一种解决方案是继承com.google.api.server.spi.SystemServiceServlet 类并在doPost 方法中打开会话。该方法处理发送到端点的所有请求。您还应该使用 @JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) -annotation 注释您的实体,因为 Jackson 将无法解析这些字段。

    【讨论】:

    • 这是一个非常好的答案。谢谢你。我们早就围绕这个问题进行了设计,但会考虑覆盖 doPost() 以满足未来需求或重构。
    【解决方案2】:

    在 Cloud Endpoints Generated Client 代码中,您会发现对于您公开的每个方法,都有一个可以设置的 setFields 方法。使用它,它应该只返回特定的字段。

    【讨论】:

    • 我很欣赏这个尝试,但这并不能真正回答这个问题。您只是在描述如何屏蔽客户端的字段。问题是如何在服务器端的请求处理程序中这样做。
    猜你喜欢
    • 2017-04-20
    • 1970-01-01
    • 1970-01-01
    • 2017-07-21
    • 2016-07-26
    • 1970-01-01
    • 1970-01-01
    • 2014-01-09
    • 1970-01-01
    相关资源
    最近更新 更多