【问题标题】:SOAP API parameter best practiceSOAP API 参数最佳实践
【发布时间】:2015-10-02 21:00:47
【问题描述】:

我有一组肥皂网络服务,它们与同一架构中的应用程序紧密耦合,但我还需要它作为 API 以供其他应用程序挂钩。

目前,服务使用这样的参数(和方法)结构

Entity GetEntity(int entityId) 实体 GetEntityByName(string entityName) ....等等。

在创建的情况下,我使用: void CreateEntity(实体实体)

我想知道这样做会更好吗:

EntityResponse GetEntity(EntityRequest requestObj) .....

在 requestObj 中,我有 id、entityName 以及根据用户提供的内容,我可以执行任一功能。

对于创建它会是:

CreateEntityResponse CreateEntity(CreateEntityRequest requestObj).

我的想法是,通过这样做,API 可以在内部进行更改...添加新参数等,而不会立即破坏已经完成的任何集成。

【问题讨论】:

  • Entity 对象不是已经拥有所有这些属性了吗?如果不是,为什么?
  • 我确实有一个实体对象,其中包含所有内容。我也考虑过使用它作为参数,但如果我想在将来添加另一个参数怎么办?我什至应该考虑到这一点吗?

标签: web-services api soap parameters


【解决方案1】:

我认为您可能需要考虑几个设计原则:

1) 数据库实体与数据传输对象 DTO

看起来那些实体直接来自数据库映射?只是将您的实体公开为 API,基本上是一个花哨的 SQL 查询浏览器。这不一定是错误的,但如果您在 API 中公开 DTO,您将获得更好的解耦。 DTO 可能比实体更具未来性,并且更通用。

2) SOAP 与 REST

如果您想最大限度地进行未来验证,您可能需要考虑 REST。使用 REST 规范,您可以在以后扩展 API 的更多选项。 例如,如果您查看像 Facebook 这样的 API,它们纯粹传递参数,然后您会收到返回的参数的键值映射。非常通用。 在 SOAP 中,您总是会预先定义所有这些最终属性。您基本上需要引入占位符等。 SOAP 是一个很好的合约协议,并且具有代码生成工具更新和更多等优点,这当然是有原因的。但是使用 REST,您可以更加灵活,同时失去 SOAP 中的一些优点。

这也是一本很好的读物: https://www.mulesoft.com/lp/whitepaper/api/secrets-great-api 或者一般来说,Mule 的 RAML 设计规范在设计 REST API 时是一个非常强大的工具。

【讨论】:

  • 是的,我目前拥有的对象包含数据库中的所有内容。我认为我同意 DTO 是我应该做的,但我的问题是我应该将它们包装在请求/响应对象中吗?
  • 我以前见过这样的结构,但是我看不出有什么不同。在我看来,它看起来是一样的:如果你有一个“RequestObject”,然后在里面放了一个 DTO,那么你的 RequestObject 也是一个 DTO!如果您有在所有远程调用中相同的其他 MetaInformation,我只会使用 RquestObject 构造。例如:UserId、sessionId 或类似的。所以像抽象信息一样独立于 API 方法。但如果只是功能数据,我会把它放到 DTO 中。
  • 谢谢塞巴。我在一些 API 中看到并使用了这个想法,但并不多,所以想知道是否有我可能遗漏的设计原则。我将使用 DTO
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-24
  • 2016-03-23
  • 2013-10-23
相关资源
最近更新 更多