Questions tagged «api-design»

应用程序编程接口(API)设计讨论了创建用于通用或公共用途的库的最佳实践。

4
MVC和RESTful API服务
MVC非常简单。有一个模型,一个控制器和一个视图。当我们创建一个网站时,这一切都将作为一个整体' 客户端向服务器发送REST关键字请求->服务器将请求的URL与控制器操作相匹配->然后调用模型进行数据收集/处理,以获取结果->并将结果作为HTML页面(视图)返回给客户端。 如果我们正在谈论纯RESTful API Web服务该怎么办?然后,流程类似于“ 客户端向服务器发送REST关键字请求->服务器将请求的URL匹配到控制器操作->然后调用模型进行数据收集/处理,获得结果->并返回结果以JSON ' 返回给客户端。与以前相同,但是没有“视图” ...或者,可以将生成的JSON视为“视图”。从某种意义上讲,我们仅在利用MVC的MC部分。那是应该怎么做的?还是对于仅API服务而不是MVC还有其他更合适的模式吗?

3
如何设计REST API来处理非CRUD操作?
我正在尝试将一组基于SOAP的服务转换为RESTful API。 我首先通过分析操作名称来识别资源,然后获得了资源Subscription。 当我需要更新订阅的状态时,不能直接向POST服务器发送请求,因为我没有直接访问资源的权限,但是我需要调用一些RPC样式的操作来更新其属性。此外,仅且仅当我将订阅状态更改为“活动”时,才需要对外部服务的附加调用。 在这些情况下,处理基础操作的最佳实践是什么? 我想出的解决方案是使用查询参数,这样,如果我需要调用激活服务,则可以使用以下方法: POST /subscriptions/{subscriptionid}/?activate=true 考虑到我不能直接更新我的订阅对象字段,是否有最佳实践来处理这种转换? 更新1: 我可以在POST请求的正文中放入一些值,例如“ state”:“ active” 并检查我的服务中要触发的正确操作。

3
不直观的C#String.Split()实现的原因
在C#中,如果我想将a分开string,string则必须执行以下操作: testString.Split(new string[] { "anotherString" }, StringSplitOptions.None); 从过载的String.SplitMSDN文档中,我们可以看到实现以及为什么必须进行这样的调用。 来自Python,我很难正确理解为什么需要这样的调用。我的意思是我可以Regex.Split用来获得与Python实现类似的语法,但是对于任何简单的事情,我都必须以降低性能(设置时间)为代价来实现。 因此,基本上,我的问题是,为什么我们不能做这样的事情: testString.Split("anotherString"); 请注意,我不建议任何原型或实现。我了解,考虑到当前的API,为什么您无法实现上述版本。我的目标是考虑到上述语法带来的好处,为什么要创建这样的API。到目前为止,灵活性似乎已成为当前潮流的目标String.Split,但老实说,我确实认为在某种程度上可以提高性能。我想我错了。

2
警报系统架构
我想创建一个系统,处理来自各种程序的警报消息,并可以通过电子邮件将这些警报处理给顺风顺水的消费者。所有这些都将包含在一个内部网络中。 我想我希望基本架构看起来像这样: 我目前主要关心的是“消息处理程序”位,这就是我的“ API排序”。我希望该系统的所有组件将数据发送到API,该API处理所有对数据库的写入。我认为这种方法比较容易,因为它简化了安全性,并允许我将许多更复杂的数据库查询包含在一个程序中。 令人担心的是,我希望这与语言无关,这意味着任何代码都应能够将消息发送到我的处理程序,由它来解释它们。我希望通过JSON平面文件-或通过对该程序的REST调用(为下游应用程序提供灵活性)来做到这一点。 我的问题是 我应该烦恼消息处理程序吗?或者它会增加简单性,使其仅允许直接数据库访问下游应用程序以及其他两个组件(管理控制台和警报管理器)? 这样,他们就可以插入想要的任何警报-只要将INSERT插入数据库表中即可。 我不是专业的软件设计师,所以请原谅-我只想在业余时间做一个项目。

1
为什么Null-Safe运算符(例如“ Elvis运算符”)被Java 7的“项目代币”拒绝?
Java 7的“项目硬币”的建议功能之一是“猫王运算符”。一个2009年的JavaOne大会上演示的报告对项目硬币将其形容为这样的: 本演示文稿介绍的“小功能”之一是所谓的“猫王运算符”,这是三元运算符的更简洁版本。我发现自己在使用传统Java时缺少了Groovy的某些功能,如果添加了它,这将是我可以同时使用两种语言的一种运算符。“ Elvis”运算符可方便地指定默认值,该默认值可在评估表达式为null时使用。像Groovy的安全导航运算符一样,这​​是一种指定如何避免不必要的null的简洁方法。我以前在博客中写过关于如何避免NullPointerException的博文。 尽管最终实现了Project Coin的其他方面,但这一方面并未实现。尽管猫王运算符在JavaOne上被提出可能被纳入,但为什么最终还是被拒绝了? 明确地说,我要特别询问该运算符,以及它被拒绝作为Java 7“ Project Coin”的一部分的原因,因为当时已对其进行了认真考虑。我怀疑在讨论了拒绝邮件的原因的邮件列表或此类邮件列表,但找不到任何东西。如果有更多关于为什么它不包含在Java的任何版本中的一般信息,则可以接受,但不是首选。
10 java  api-design 

4
在错误消息中包括指向相关文档的链接?
我们创建了一个供外部开发人员使用的商业库和代码示例。我们有(封闭的,可供注册用户使用)文档,其中广泛解释了如何使用该库。 许多开发人员是首次使用,因此会遇到很多基本错误。 在错误日志中包含指向文档的链接是否合适?可能的不利之处是什么?我可以预见一些,但似乎有可能克服以下问题 文档URL已过期 最新文档中未反映的特定于版本的错误 还有其他问题,我们通过将开发人员发送给无关的文档来浪费开发人员的时间 在我的意思示例下面,添加粗体字是个好主意吗? [错误]无法在独立项目上执行目标org.apache.maven.plugins:maven-archetype-plugin:1.2.3:generate(default-cli):所需的原型不存在(com.example.library。 archetypes:library-archetype-blank:1.2.3.0)->请参阅http://example.com/docs/setting-up-an-archetype了解更多信息和可能的故障排除

2
为什么在Oracle Java教程中将检查与未检查的异常称为“争议”?
我是Java新手,正在阅读有关异常的文档。,尤其是“ 未经检查的异常”-“争议”页面。 底线是: 如果可以合理预期客户端会从异常中恢复,请将其设置为已检查的异常。如果客户端无法采取任何措施来从异常中恢复,请将其设置为未经检查的异常。 我不明白这篇文章。什么是“争议”?你能用简单的话来解释吗?

2
“ Demeter法”是否适用于公共/ API方法签名?
鉴于对API /公共方法签名的更改应尽可能少,以防止破坏使用这些方法的客户端代码,我想知道Demeter法则是否不适用于这些方法。 一个简单的例子: class Account() { double balance; public void debit(Transaction t) { balance -= t.getAmount(); } } 请注意,借记方法传递的是交易对象,而不是仅仅两倍的金额(据我所知,``德米特尔法则''会说只传递所需的信息,在这种情况下,只是传递金额,而不是交易对象... )。其背后的原因是因为将来该方法可能需要除数量之外的其他一些交易属性。据我了解,这将防止将来通过添加新参数来破坏方法签名。 那么,这是否使之成为明智的选择?还是我错过了什么?

5
C语言中的API设计陷阱
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 有哪些缺陷使您无法使用C API(包括标准库,第三方库和项目内的标头)?目的是确定C语言中的API设计陷阱,以便编写新C库的人们可以从过去的错误中学习。 解释为什么缺陷不好(最好举个例子),并尝试提出改进建议。尽管您的解决方案在现实生活中可能不切实际(修复为时已晚strncpy),但它应该提请未来的图书馆作家。 尽管此问题的重点是C API,但是仍然存在影响您以其他语言使用它们的能力的问题。 请为每个答案给出一个缺陷,以便民主可以对答案进行排序。
10 c  api-design  pitfalls 


2
如何避免未经授权使用API​​?
我必须设计一个“小部件”,一个脚本,合作伙伴将其嵌入到他们的网站中以显示一些UI并调用我们的API。 基本上,它将根据API调用中提供的一些ID在这些网站上显示我们的数据。我们要避免的是有人滥用API并使用它来刮擦我们的整个目录。 嵌入脚本的每个合作伙伴都将获得一个公开密钥,在调用API时必须提供该公开密钥。一个想法是让他们在加载脚本时附加此密钥,例如: <script src="//initrode.com/widget/loader.js?key=xxxx"></script> 这样,对脚本的请求可用于注册密钥/源IP对,并仅在密钥/ IP对与已注册的密钥/源IP对匹配(生命周期有限且每天的请求受到限制)时才应答后续的API调用。 我不确定这是个好主意,因为通过混淆显然是安全的(有人重新加载脚本会完全绕过它);但我没有其他限制访问的方法。我不能为每个用户提供唯一的密钥,只能给合作伙伴提供。我不能使用私钥系统,因为任何人都可以使用所有代码。它基本上是限制对公共API的访问,即在定义上是矛盾的。 您如何看待该解决方案,您将如何应对这些约束?

3
如果出现解析错误,我将如何设计提供详细信息的TryParse方法?
解析用户输入时,通常建议不要抛出和捕获异常,而应使用验证方法。在.NET BCL中,这将是例如int.Parse(在无效数据上引发异常)和int.TryParse(返回false无效数据)之间的区别。 我正在设计自己的 Foo.TryParse(string s, out Foo result) 方法,我不确定返回值。我可以用bool像.NET自己的TryParse方法,但不会给有关指示类型的错误,有关的确切原因,为什么 s不能被解析成Foo。(例如,s括号可能不匹配,或者字符数错误,或者Bar没有对应的Baz等)。 作为用户的API,我强烈不喜欢它就会返回一个成功/失败布尔瞒着我的方法为什么操作失败。这使得调试猜测游戏成为可能,我也不想将其强加给图书馆的客户。 我可以想到很多解决此问题的方法(返回状态代码,返回错误字符串,将错误字符串添加为out参数),但是它们都有各自的缺点,我也想保持与.NET Framework。 因此,我的问题如下: .NET Framework中是否存在与简单的true / false布尔值相比,(a)解析输入而不抛出异常,并且(b)仍返回更详细的错误信息的方法?
9 c#  .net  api-design 

3
API对象定义包含第三方引用ID作为属性是否不好?
像这样: Campaign: type: object properties: id: type: string description: "A GUID identifier" referenceId: type: string description: "A consumers identifier they have used to map their own systems logic to this object." name: type: string description: "'Great Campaign 2017' as an example" 我担心referenceId。 系统域是一个平台,该平台通过数据导出和各种格式(xml,excel)的导入以多种方式与第三方集成。它已经足够成熟,可以允许第三方通过API与我们的系统集成,而该API的设计正是引发这一问题的原因。 我们有一个名为Campaign的对象,该对象的ID可用于识别和检索资源。我们API的消费者可能在自己的域内拥有自己的参考代码,以作为他们认为是广告系列的参考代码。 我们系统中还有其他带有第三方参考字段的对象,这是我们现有消费者所期望的。但是我担心这给我们增加了映射的负担,我们不知道这个referenceId是什么(数字,文本,json?),并且为新使用者增加了另一个令人困惑的属性。 在API的公共对象定义中允许第三方引用ID字段被视为不良做法或不良设计?

2
增加一组有限的选项;API重大变化?
以一个HTTP API端点为例,它发出以下响应模型: { "type": "Dog", "name": "Jessi", ... } 该type领域已经在文档中被描述为一个Dog,Cat或Fish。 例如Rat,是否将添加新选项视为API的重大更改? 将选项添加到有限列表(开发人员可以打开该列表)是否被视为对API的扩展或修改?
9 rest  api  api-design  json 

3
用REST的话来说,资源和表示之间有什么区别?
我对REST的理解使得可以将服务操作建模为状态的表示,并使用HTTP从一种状态转换为另一种状态。直到最近,当我阅读Jimmy Bogard的这篇文章时,我一直将资源理解为服务端状态的代表,我知道他是一个受到社区尊重的聪明的开发人员/架构师。引用该帖子的特定声明 表示形式有所不同–它描述了资源的当前状态(在请求时)。 这让我感到困惑。关于该主题的普遍看法是什么?
9 rest  api  api-design 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.