Questions tagged «api»

应用程序编程接口(API)是要供其他软件使用的软件的规范。

2
创建REST API错误响应模型和错误代码系统的最佳方法是什么?
我的REST实现将使用以下结构在JSON中返回错误: { "http_response":400, "dev_message":"There is a problem", "message_for_user":"Bad request", "some_internal_error_code":12345 } 我建议创建一个特殊的响应模型,在该模型中,我可以传递所需的属性值(dev_message,message_for_user,some_internal_error_code)并返回它们。在代码中将类似于以下内容: $responseModel = new MyResponseModel(400,"Something is bad", etc...); 此模型应如何显示?是否应该在仅传递文本信息的地方实现例如successResponse()这样的方法,并且那里的代码默认为200?我坚持这一点。这是我的问题的第一部分:我是否需要实现此模型,这是一种很好的做法吗?因为现在,我只是直接从代码返回数组。 第二部分是关于错误代码系统。错误代码将在文档中进行描述。但是我遇到的问题是代码。管理错误代码的最佳方法是什么?我应该在模型中编写它们吗?还是最好创建单独的服务来处理此问题? 更新1 我已经实现了响应的模型类。这类似于格雷格的答案,逻辑相同,但是另外,我在模型中对错误进行了硬编码,这是它的样子: class ErrorResponse { const SOME_ENTITY_NOT_FOUND = 100; protected $errorMessages = [100 => ["error_message" => "That entity doesn't exist!"]]; ...some code... } 我为什么要这样做?那又是为了什么呢? 代码看起来很酷: return new ErrorResponse(ErrorResponse::SOME_ENTITY_NOT_FOUND ); …
15 php  mvc  rest  api 

7
C库的函数是否应该总是期望字符串的长度?
我目前正在使用C语言编写的库。该库的许多功能都希望在其参数中包含char*或字符串const char*。我从那些函数开始就一直期望字符串的长度为a,size_t这样就不需要空终止。但是,在编写测试时,这导致频繁使用strlen(),例如: const char* string = "Ugh, strlen is tedious"; libFunction(string, strlen(string)); 信任用户传递正确终止的字符串将导致安全性降低,但更为简洁和(在我看来)可读的代码: libFunction("I hope there's a null-terminator there!"); 那么,这里的明智做法是什么?使API使用起来更加复杂,但会迫使用户考虑他们的输入,或者记录对以空值结尾的字符串的需求并信任调用者?
15 c  api  strings 

4
微服务REST或AMQP,在这种情况下
我读过许多有关微服务体系结构的文章,我想知道何时使用AMQP或REST。 我读到服务之间的松耦合是一件好事,在这种情况下,AMQP似乎是一个不错的选择。但是,如果我们使用AMQP,则意味着我们不再需要REST端点(但这意味着我们将失去HATEOAS概念)。 但是REST真的是构建我的服务的好方法吗?原因我将不使用任何端点...在这种情况下,一个端点比另一个端点更好? 什么时候应该使用其中一个?

1
单元测试API客户端和包装器
我一直在兜圈子,试图找出对我正在开发的API客户端库进行单元测试的最佳方法。该库具有一个Client基本上与API进行1:1映射的Wrapper类,以及一个额外的类,该类在的顶部提供了更加用户友好的界面Client。 Wrapper --> Client --> External API 我首先针对Client和编写了一系列测试Wrapper,实际上只是测试它们是否转发到操作的任何适当功能(Wrapper在上操作Client,并Client在HTTP连接上操作)。但是,我开始对此感到不舒服,因为我感觉自己正在测试这些类的实现,而不是接口。从理论上讲,我可以将这些类更改为具有另一个完全有效的实现,但是我的测试将失败,因为未调用我希望调用的函数。对我来说,这听起来像是脆弱的考验。 之后,我考虑了类的接口。测试应该验证类是否确实完成了其应做的工作,而不是他们是如何完成的。那我该怎么做呢?首先想到的是对外部API请求进行存根。但是,我担心过度简化外部服务。我见过的很多存根API的示例都给出了罐头响应,这听起来像是一种非常简单的方法,可以仅测试您的代码是否针对假API正确运行。另一种方法是模拟服务,这是不可行的,并且每当真实服务发生变化时就需要保持最新状态-感觉像是过分杀伤和浪费时间。 最后,我从程序员SE的另一个答案中读取了此内容: 远程API客户端的工作是发出某些调用-不多也不少。因此,它的测试应验证它是否发出了这些呼叫-不多也不少。 现在,我或多或少地确信-测试时Client,我需要测试的是它向API发出了正确的请求(当然,总有API会更改但我的测试继续通过的可能性-但这就是集成测试很有用的地方)。由于Client与API只是1:1的映射,因此在将一个有效实现更改为另一个之前,我的担心并没有真正适用-的每种方法只有一个有效实现Client。 但是,我仍然坚持Wrapper上课。我看到以下选项: 我对Client类进行存根处理,然后测试是否调用了适当的方法。这样,我做的与上述相同,但是将其Client作为API的替代。这使我回到了起点。再一次,这给了我测试实现而不是界面的不舒服的感觉。将Wrapper很可能使用了完全不同的客户端实现。 我创建一个模拟Client。现在,我必须决定对它进行模拟的程度-创建服务的完整模拟将花费很多精力(比库本身要付出更多的工作)。API本身很简单,但是服务却很复杂(本质上是一个对数据进行操作的数据存储)。再说一次,我将必须使模拟与real保持同步Client。 我只是测试是否正在发出适当的HTTP请求。这意味着Wrapper将通过一个真实的Client对象进行调用以发出这些HTTP请求,因此我并不是在单独测试它。这使得它有点可怕的单元测试。 因此,我对这些解决方案都不满意。你会怎么做?有正确的方法去做吗?

1
API密钥-输入内容或标题
目前正在研究API,只是想就应该在哪里传输API密钥的最佳位置收集意见。我知道这不应该放在URL中,这样就留下了请求标头或消息正文。 如果将其放在标头中,则可以提出一种可以在所有服务中使用的通用方法,但是我得到的规范希望它在正文中(例如,包含在JSON字符串中) POST正文中的序列化对象)。
14 api 

1
在REST模型中嵌套资源的正确方法是什么?
我正在设计服务的REST API,并陷入了嵌套资源的正确方法。 资源:合作伙伴,票证,设置 资源之间的联系: 伙伴有很多票, 合作伙伴有一组设置, 业务逻辑: 您可以将所有合作伙伴列为匿名用户, 您可以将新票证添加为指定合作伙伴的匿名用户, 只有伙伴可以列出他的门票, 只有合作伙伴可以修改票证, 只有合作伙伴可以列出设置, 只有合作伙伴可以修改设置, 到目前为止,我所做的是: 合作伙伴资源 GET / partners-列出所有合作伙伴 GET / partners /:id-显示由:id参数指定的合作伙伴的详细信息 GET / partners /:partner_id / tickets-合作伙伴的票据列表 GET / partners /:partner_id / tickets /:id-详细信息指定伙伴的工单的 POST / partners /:partner_id / tickets-保存新工单 PUT / partners /:partner_id / tickets /:id-更新由:id参数指定的工单 GET / …
14 api  rest  api-design 

5
在API设计中,何时使用/避免临时多态性?
Sue正在设计一个JavaScript库Magician.js。它的关键是Rabbit从传递的参数中拉出一个函数。 她知道它的用户可能想从a String,a Number,a Function甚至甚至是a中拔出一只兔子HTMLElement。考虑到这一点,她可以这样设计API: 严格的界面 Magician.pullRabbitOutOfString = function(str) //... Magician.pullRabbitOutOfHTMLElement = function(htmlEl) //... 上面示例中的每个函数都知道如何处理函数名称/参数名称中指定的类型的参数。 或者,她可以这样设计: “临时”界面 Magician.pullRabbit = function(anything) //... pullRabbit必须考虑该anything参数可能具有的各种不同的预期类型,以及(当然)意外类型: Magician.pullRabbit = function(anything) { if (anything === undefined) { return new Rabbit(); // out of thin air } else if (isString(anything)) { // more } else if (isNumber(anything)) …

4
在流利的API中使用自然语言语法
我正在修改基于WebSQL / Phonegap数据库API的查询抽象,我发现自己既对定义一种模仿自然英语语法使用的流畅API感兴趣,又对此表示怀疑。 通过示例解释这可能是最简单的。以下是我语法中所有有效的查询,并且注释说明了预期的语义: //find user where name equals "foo" or email starts with "foo@" find("user").where("name").equals("foo").and("email").startsWith("foo@") //find user where name equals "foo" or "bar" find("user").where("name").equals("foo").or("bar"); //find user where name equals "foo" or ends with "bar" find("user").where("name").equals("foo").or().endsWith("bar"); //find user where name equals or ends with "foo" find("user").where("name").equals().or().endsWith("foo"); //find user where name …
14 javascript  api 


6
您如何学习语言的标准框架/ API /功能?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,以使它成为软件工程堆栈交换的主题。 4年前关闭。 我了解如何编码。我知道如何解决我经常使用的语言的基础知识。我知道如何编写略高于基本的正则表达式,可以与数据库对话,可以接受输入,打印输出,处理文件等。我或多或少地确信我可以吐出源代码的基本能力中等复杂的程序。 我的问题是我永远都觉得不够。我觉得我只了解我的语言的标准库的一小部分,在我完全理解之前,至少是顺便说一句,我什至无权尝试使用它。我刚离开(社区/初级/ whathaveyou)大学,而我的朋友正在从事该行业的工作,但是我仍然感觉像是假货或装腔作势者,而且我还不够出色。 是否有一个不错的标记“我足够了解”,我可以用来向自己保证可以编码?我是否应该认为我至少有能力编写FizzBu​​zz作为可以申请的指标?如何相对轻松地了解更多这些标准库,框架和/或API?我定期编写代码,阅读书籍,但是我的知识仍然很肤浅。 救命!

5
如何模拟REST API?
我正在研究一个新项目,该项目将从第三方REST API查询数据。这是用于实时体育数据供稿,因此,供稿仅在实际进行比赛时才起作用。 尽管第三方提供了很好的文档(XSD等),但是他们无法模拟游戏的进行,因此要测试我针对该API编写的代码,我必须等待实际的游戏进行。 我唯一的办法就是自己编写代码来模拟游戏,但这似乎需要大量工作。您将如何处理?
13 api  rest 

2
RESTful API是否应该提供整个表单的数据?
假设我有一个JavaScript Web应用程序,它完全使用RESTful API来处理数据。 假设此应用程序具有数据表单,并且假设我正在/ product / 12345上编辑一条记录。构建表单时,我向/ product / 12345发出RESTful请求并获取JSON数据: { "id": 12345, "name": "Some Product", "active": true, "sales_user_id": 27 } 因此,我的表单显然可以具有用于选择销售人员的下拉列表。我需要填充此列表。 数据应该从哪里来?最常见的方法是什么? 使其成为/ product / 12345请求响应的一部分有意义吗? { "id": 12345, "name": "Some Product", "active": true, "sales_user_id": 27, "sales_users": [ {"id": 1, "name": "Anna Graham"}, {"id": 2, "name": "Dick Mussell"}, {"id": …
13 api  rest  forms 

5
通过公共API设计平衡依赖项注入
我一直在考虑如何通过提供简单的固定公共API来平衡使用依赖注入的可测试设计。我的困境是:人们希望做类似的事情var server = new Server(){ ... },而不必担心创建a Server(,,,,,,)可能具有的许多依赖关系和依赖关系图。在开发过程中,我不必担心太多,因为我使用IoC / DI框架来处理所有这些事情(我没有使用任何容器的生命周期管理方面,这会使事情进一步复杂化)。 现在,依赖关系不太可能重新实现。在这种情况下,组件化几乎纯粹是为了可测试性(和体面的设计!),而不是为了扩展等而创建接缝。人们将有99.999%的时间希望使用默认配置。所以。我可以对依赖项进行硬编码。不想这样做,我们会丢失测试!我可以提供一个带有硬编码依赖关系的默认构造函数,以及一个带有依赖关系的构造函数。那是...杂乱无章,可能令人困惑,但可行。我可以将接收构造函数的依赖项设置为内部,并使我的单元测试成为一个朋友程序集(假定为C#),它整理了公共API,但留下了一个隐藏的陷阱供维护。在我的书中,具有两个隐式连接而不是显式连接的构造函数通常是不好的设计。 目前,这是我能想到的最少的邪恶。意见?智慧?
13 c#  api 

1
开发社区是否广泛接受开放数据协议(odata)?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 编辑:如果您不熟悉odata,请前往这里。 我正在尝试确定是否值得学习这项技术,或者它是否会流行。 前提很有趣,作为API的开发人员,这似乎是向使用它们的开发人员提供更大灵活性的好方法。 不幸的是,在过去的几年中,我对开放数据协议没有太多的“嗡嗡声”,因此只是尝试评估一下一旦我学会了它,它是否有可能出现。 提前致谢。

1
API身份验证,一次性令牌与动态令牌
我们正在开发一个新项目,我们是两个主要开发人员,并且在如何使用令牌保护服务器与客户端之间的通信方面处于十字路口。 第一个建议:(一次性令牌AKA静态令牌) 客户端通过向api发送用户名和密码以及current_time(此变量也将保存在服务器的数据库和客户端中)来请求主令牌,服务器解释输入并呈现哈希令牌(例如: 58f52c075aca5d3e07869598c4d66648)将其保存在数据库中,并将其返回给客户端。 客户端现在保存主令牌,并使用主令牌+身份验证请求中发送的current_time变量创建新的哈希令牌(让我们将此新令牌称为main_token),服务器也将执行相同操作,并使用相同的算法创建相同的令牌。 客户端每次查询服务器API时,都会将main_token发送到服务器,现在服务器会将其中生成的令牌与客户端发送的main_token进行比较,如果匹配,则表示用户是真实的 第二个建议:(动态令牌) 客户端生成两个随机键($ key1 = rand(10000,90000); $ key2 = rand(10000,90000);)在API上的每个请求上,客户端都会使用查询类型创建一个哈希,而两个键分别为一个复杂的算法,然后将这两个密钥+哈希发送到服务器 服务器使用与客户端相同的算法,创建一个哈希,然后将其与客户端发送的哈希进行比较,如果匹配,则服务器继续处理查询 现在的问题是,哪一种是用于保护API请求的最合理,最安全的方法?
13 security  api 

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.