Questions tagged «web-services»

Web服务是旨在支持网络上可互操作的机器对机器交互的软件系统。

3
REST端点为预见的更改进行规划的建议模式是什么
尝试为具有变更前瞻性的外部应用程序设计API并非易事,但预先考虑可以使以后的生活变得更轻松。我正在尝试建立一个方案,以支持将来的更改,同时通过保留先前的版本处理程序来保持向后兼容。 本文的主要关注点是对于给定产品/公司,所有定义的端点应遵循哪种模式。 基本方案 鉴于基本URL模板https://rest.product.com/我设计,所有的服务都位于下/api沿/auth和其他基于非休息终点如/doc。因此,我可以如下建立基本端点: https://rest.product.com/api/... https://rest.product.com/auth/login https://rest.product.com/auth/logout https://rest.product.com/doc/... 服务端点 现在是端点本身。关注度POST,GET,DELETE不是本文的主要目的,是对这些行为本身的关注。 端点可以分为名称空间和动作。每个动作还必须以支持返回类型或所需参数的基本更改的方式显示自己。 在注册用户可以发送消息的假设聊天服务中,我们可能具有以下端点: https://rest.product.com/api/messages/list/{user} https://rest.product.com/api/messages/send 现在添加版本支持,以支持将来可能会中断的API更改。之后我们既可以添加版本签名/api/或之后/messages/。给定send端点,我们可以为v1提供以下内容。 https://rest.product.com/api/v1/messages/send https://rest.product.com/api/messages/v1/send 所以我的第一个问题是,版本标识符的推荐位置是什么? 管理控制器代码 因此,现在我们已经确定需要支持以前的版本,因此需要以某种方式处理可能随着时间而弃用的每个新版本的代码。假设我们正在用Java编写端点,则可以通过包来管理它。 package com.product.messages.v1; public interface MessageController { void send(); Message[] list(); } 这样做的好处是,所有代码已通过命名空间分隔开,其中的任何重大更改都将意味着服务端点的新副本。这样做的不利之处在于,需要复制所有代码,并且希望对每个副本都应用/测试希望应用于新版本和先前版本的错误修正。 另一种方法是为每个端点创建处理程序。 package com.product.messages; public class MessageServiceImpl { public void send(String version) { getMessageSender(version).send(); } // Assume we have …

2
从JSON移至Protobuf。这值得么?
我们有可以提供XML或JSON(WCF)的REST Web服务。我在玩实现Protobufs的想法。为什么? 优点 减轻服务器负载。 较小的邮件大小-较少的流量。 现在切换比现在容易。 缺点 需要实施 很难对消息进行故障排除/嗅探以进行调试。 我可以在服务器上启用GZip,而JSON将消耗尽可能多的流量 您对此有何建议和/或经验?

5
如何对需要Web服务调用的类进行单元测试?
我正在尝试测试一个调用某些Hadoop Web服务的类。代码几乎是以下形式: method() { ...use Jersey client to create WebResource... ...make request... ...do something with response... } 例如,有一个创建目录方法,一个创建文件夹方法等。 鉴于代码正在处理我无法控制的外部Web服务,我该如何对其进行单元测试?我可以尝试模拟Web服务客户端/响应,但这违反了我最近看到的指导方针:“不要模拟您不拥有的对象”。我可以设置一个虚拟Web服务实现-仍然构成“单元测试”还是将其作为集成测试?只是不可能在如此低的水平上进行单元测试-TDD从业者将如何做到这一点?

4
REST与RESTful与“普通” Web服务-是否相同?
我已经阅读了关于REST和/或RESTful应用程序的一些定义和讨论,但是我仍然不了解它的真正含义。 我通常使用的应用程序要么通过GET获取数据,要么通过POST发送数据到某个Web服务(通常是PHP脚本),然后从数据库获取数据或将数据写入数据库。 现在,这是RESTful应用程序吗?如果没有,那么什么是RESTful应用程序?RESTful概念和我到目前为止合作过的概念有什么区别?请举例说明。 另外,有人在谈论REST,有人在谈论RESTful应用程序。我发现REST术语是指理论概念,而当我们谈论特定的应用程序时则使用RESTful。这是正确的做法还是REST和RESTful应用之间存在真正的区别?

4
维护移动客户端和服务器之间的参照完整性
所以我有一个相对简单的系统。一个移动客户端在sqlite数据库中创建我想同步到远程SQL服务器(与其他移动客户端共享)的记录。因此,当我在电话的sqlite表中创建新记录时,我随后通过RESTful API将更改推送到远程服务。我遇到的问题是如何排序主键,以便数据中没有冲突(即电话中的记录具有与服务器上完全不同的记录相同的主键)。在客户端上引用记录并在服务器上引用相同记录的最佳实践是什么?
21 sql  web-services 

4
人们为什么认为不推荐使用SOAP?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 6年前关闭。 今天浏览SO时,我发现了这个 这里问题,它从下面开始: 当然,您会告诉我SOAP已被弃用,而我被迫使用它 到目前为止,在SO上发现了很多这样的声明,这只是触发了我提出这个问题。 REST有它的用途,SOAP有它的用途,在某些地方它们作为功能相交,但不能相互替换。 所以我想知道,为什么人们认为SOAP被“弃用了”?是无知吗?SOAP和WS- *规范的复杂性?REST炒作?什么? 如果您认为不赞成使用SOAP,请告诉我原因。我很好奇!
20 web-services  soa  soap 

2
有没有人曾经要求过SSL证书的保修?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为软件工程堆栈交换的主题。 8年前关闭。 SSL证书通常会宣传不同数量的担保或保证,例如$ 500,000或$ 1m。 我的问题是,在SSL的历史上,有没有人成功地成功声明过其中一项保证?曾经有过一个案例吗?如果不是,可以假设它们只是营销头是否公平?

4
为什么不使用SQL而不是GraphQL?
最近,我了解了GraphQL,它声称比RESTful更好。但是,我开始怀疑为什么不将SQL语句简单地放入HTTP GET请求中。 例如,在GraphQL中,我将编写 { Movie(id: "cixos5gtq0ogi0126tvekxo27") { id title actors { name } } } 这并不比它的SQL比较简单 SELECT id, title FROM movies WHERE id = cixos5gtq0ogi0126tvekxo27; SELECT actors.name FROM actors, actors_movies WHERE actors.id == movies.actor_id AND movie.id == cixos5gtq0ogi0126tvekxo27; 也许我们可以对查询进行URL编码并发送到服务器 GET endpoint?q=SELECT%20id%2C%20title%20FROM%20movies%20WHERE%20id%20%3D%20cixos5gtq0ogi0126tvekxo27%3B%0ASELECT%20actors.name%20FROM%20actors%2C%20actors_movies%20WHERE%20actors.id%20%3D%3D%20movies.actor_id%20AND%20movie.id%20%3D%3D%20cixos5gtq0ogi0126tvekxo27%3B HTTP/1.1 是的,查询URL可能太长,但是如果您不关心REST遵从性,则可以将其放入POST请求的正文中。(顺便说一句,我认为需要对REST进行HTTP RFC的修订才能有意义:限制查询字符串的长度从一开始就将实现与规范混合在一起) 从客户端直接发出SQL的优势还在于 解析GraphQL不需要服务器端代码/库,从而减少了开发时间。 解析GraphQL不需要服务器端开销,从而减少了运行时间。 SQL语句比GraphQL灵活得多,因为(在大多数情况下)GraphQL无论如何都会简化为SQL。 每个人都知道SQL。 那么,GraphQL与SQL相比有什么优势?


5
内部和外部API架构
我工作的公司保持着成功的SaaS产品,这些产品多年来“有机地”增长了。我们计划用一系列新产品扩展产品线,这些新产品将与现有产品共享数据。为此,我们希望将业务逻辑整合到一个地方:Web服务层。WS层将由以下人员使用: 网络应用 导入数据的工具 与其他客户端软件集成的工具(本身不是API) 我们还希望创建一个可供我们的客户使用的API,这些客户可以使用该API创建自己的集成。我们正在努力解决以下问题: 内部API(又称WS层)与外部API是否应在同一方面,并​​具有安全性和权限设置以控制谁可以完成操作,还是应该是两个单独的应用程序,其中外部API仅调用内部API像其他应用程序一样?到目前为止,在我们的辩论中看来,将它们分开可能更安全,但会增加开销。 其他人在类似情况下做了什么?
19 api  web  web-services 

3
在RESTful API中处理令牌更新/会话到期
我正在构建一个使用JWT令牌进行用户身份验证的RESTful API(由login端点发出,然后在所有标头中发送),并且需要在固定时间后刷新令牌(调用renew端点,该端点将返回更新的令牌) )。 用户的API会话有可能在令牌到期之前变得无效,因此我的所有端点都首先检查以下各项:1)令牌仍然有效,以及2)用户会话仍然有效。由于客户端将令牌存储在本地,因此无法直接使令牌无效。 因此,我所有的端点必须向我的客户发出两种可能情况的信号:1)是时候续订令牌了; 2)会话已变为无效,并且不再允许它们访问系统。我可以想到两种替代方法,当两种情况之一发生时,我的端点可以向其客户端发出信号(假设客户端可以适应任一选项): 如果会话无效,则返回http 401代码(未经授权),或者在令牌到期且需要调用renew端点时返回412代码(前提条件失败),这将返回200(正常)代码。 返回401,表示会话无效或令牌已过期。在这种情况下,客户端将立即调用该renew端点,如果它返回200,则刷新令牌,但是如果renew还返回401,则意味着该客户端不在系统之外。 您会推荐上述两种选择中的哪一种?哪一个会更标准,更容易理解和/或更RESTful?还是您会建议完全不同的方法?您发现这两种选择有明显的问题或安全隐患吗?如果您的答案包括支持您的观点的外部参考,则可以加分。 更新 伙计们,请关注一个真正的问题- 表示续订/会话无效的两个http代码替代方案中哪一个最好?不要介意我的系统使用JWT 和服务器端会话的事实,这是我的API针对非常特定的业务规则的特性,而不是我正在寻求帮助的部分;)

7
多个数据库调用与对Web API的网络调用真的很重要吗?
在我的一位雇主中,我们开发了REST(但也适用于SOAP)API。客户端即应用程序UI,将通过Web(在典型的生产部署中为LAN)对API进行调用。API将调用数据库。 在我们的讨论中反复出现的一个主题是性能:团队中的某些人认为,由于性能,您不应从单个API调用中进行多个数据库调用(通常是读取)。您应该对其进行优化,以便每个API调用仅(完全)一个数据库调用。 但这真的很重要吗?考虑到UI必须对API进行网络调用;相当大(毫秒级)。数据库经过优化,可以将内容保存在内存中并非常非常快地执行读取操作(例如,SQL Server可以将所有内容加载并保存在RAM中,如果可以的话,将消耗几乎所有的可用RAM)。 TLDR:当我们已经通过LAN进行网络调用时,担心多个数据库调用真的很重要吗?如果是这样,为什么? 明确地说,我说的是数量级-我知道这取决于具体情况(机器硬件,API和DB的选择等)。如果我有一个调用需要O(毫秒),那么是否会针对DB进行优化呼叫数量少一个数量级,实际上重要吗?还是这个问题比这还重要? 编辑:对于后代,我认为宣称在这种情况下我们需要通过组合数据库调用来提高性能是非常荒谬的,尤其是缺乏概要分析时。但是,是否执行此操作不是我的决定;我想知道认为这是优化Web API调用的正确方法的基本原理。

3
SOA服务组合实际上在实践中有效吗?
SOA主要服务设计原则之一是服务可组合性原则(https://en.wikipedia.org/wiki/Service_composability_principle)。 这个想法是,通过使用现有服务作为构建模块来组合新服务,可以迅速开发新服务。类似于实现新方法时如何调用对象的现有方法。这就是SOA可以大大提高生产力的地方。 实际上有人真的这样做吗?我已经在书面文本中看到了无休止的重复,但是我自己还没有在现实世界中工作的经验。本书的大部分内容都没有提及事务处理,这在我看来是实现可组合服务的最大障碍。 首先,在组成任何非平凡的服务之前,您确实确实需要解决交易问题。当然,如果该示例具有服务“ findCurrentTime()”和“ writeLogMessage()”,则很容易不必担心事务,但是在具有诸如“ depositMoney()”和“ withdrawMoney()”之类的真实示例时则不必担心。 我知道两个选择: 使用WS-Atomic Transaction或类似工具实施真实交易 实施基于补偿的解决方案,使用“ cancelA()”或类似方法补偿对A的调用,如果对B的调用失败 这两个问题似乎都非常棘手/对我来说几乎无法使用: WS-原子交易 一个很大的复杂性,大多数的建议,我发现只是警告“疼痛的屁股,不这样做” 支持是有限的,例如,如果您使用开源ESB,则主要替代产品ServiceMix,Mule或WSO2不支持它 赔偿金 对我来说,实施赔偿处理似乎很复杂。如果服务A成功并且我们从未从服务B得到答案并且不知道它是失败还是成功,我们该怎么办?手动处理这种逻辑(作为合成服务的实现者)使我想裂开手腕-这是某些工具应该为我完成的工作! 我也看不到如何在非平凡的服务中使用补偿方法。假设您的服务A是“ depositMoney()”,并且成功,其他一些操作很快将钱转移到其他地方,然后我们收到“ compensateDepositMoney()”,我们现在该怎么办?好像一大罐蠕虫。 在我看来,服务组合是SOA的一项基本原则,如果您不能(方便地)组合服务,那么您真的无法获得SOA的好处。现实是什么?90%的SOA用户在没有实际服务组合的情况下使用“ crispled SOA”?还是大多数用户实际上使用服务组合,而我却夸大了它的难度?

1
确保Web API安全的最佳做法是什么?
我需要为我们的移动应用程序构建一个Web服务API,以便与我们的服务器和数据库进行交互(在ASP.Net MVC 4中,但这无关紧要)。虽然大多数操作不需要用户注册我们的服务,但我们只想限制我们应用程序用户的访问。 有什么方法可以确保拒绝从其他地方(例如,需要我们的所有数据或构建非官方应用程序的人)进行的调用? 我最初的想法是让设备向服务器请求令牌,该令牌是随机生成并按原样发送的。所有其他方法将检查请求标头是否包含特定的标头,该标头将是咸化令牌的md5哈希。服务器知道令牌和盐,并且能够计算哈希并将其与发送的哈希进行比较。另外,令牌的使用寿命有限,并且设备必须每隔一小时获得另一个令牌。 这似乎很容易实现,尽管可能不是100%证明,但这似乎是一个好主意。你怎么看?

3
如何用Java设计高度可扩展的Web服务?
我正在创建一些具有2000个并发用户的Web服务。该服务是免费提供的,因此有望获得大量用户。将来可能需要扩展到50,000个用户。 已经有一些其他问题可以解决此问题,例如 -/programming/2567254/building-highly-scalable-web-services 但是,我的要求与上述问题有所不同。 例如-我的应用程序没有用户界面,因此图像,CSS,javascript不是问题。它是用Java编写的,因此使用HipHop将PHP转换为本地代码的建议毫无用处。 因此,我决定单独询问我的问题。 这是我的项目设置- 使用Apache CXF的基于Rest的Web服务 Hibernate 3.0(具有相关的优化功能,例如延迟加载和自定义HQL以进行优化) Tomcat 6.0 MySQL 5.5 为了使基于Java的应用程序可扩展,应遵循哪些最佳实践?

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.