Questions tagged «web-services»

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

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

3
找不到资源时,我应该返回204或404响应吗?
我正在为比赛和日程表开发一个简单的RESTful服务。通过包含JSON正文的POST请求创建锦标赛时,会将锦标赛插入,BiMap在DAO实现中声明如下: private BiMap<String, Tournament> tournaments = Maps.synchronizedBiMap(HashBiMap.create()); 创建锦标赛时,将返回其关联的字符串ID,以便用户将来可以参考该锦标赛。他/她可以从执行以下请求的新锦标赛中获取信息: GET http://localhost:8080/eventscheduler/c15268ce-474a-49bd-a623-b0b865386f39 但是,如果找不到具有此类ID的锦标赛怎么办?到目前为止,我将返回204响应。好吧,泽西岛null从其中一种方法返回时正在为我做这件事。这是与上述路线相对应的方法: @Path("/{id}") @GET @Produces(MediaType.APPLICATION_JSON) public Tournament getTournament(@PathParam("id") String id) { Optional<Tournament> optTournament = tournamentDao.getTournament(id); if (optTournament.isPresent()) return optTournament.get(); return null; } 我的问题是:可以返回204: No Content响应,还是应该返回404响应,因为找不到资源? 如果我应该将其更改为404,则会出现一个明显的问题:我应该更改方法签名吗?由于现在Tournament可能不会返回(类型为)锦标赛,因此方法应该看起来有所不同。我应该使用该Response类型作为返回类型吗?
15 java  rest  web-services  http 


5
如果无法使用事务,如何在企业环境中有效地使用Web服务?
我正在工作的地方正在尝试建立一些基本规则,而我们现在正在争论的是本地库与Web服务之间的代码重用。Web服务似乎是大多数公司中的热门选择,这就是大多数开发人员都倾向于的。 我只是看不到如何有效地将Web服务用于任何严肃的工作。如果无法使用事务,如何安全地执行多个服务调用? 假设我有一个Cron工作,它从我们的数据库中获取满足一定条件的客户,这些客户需要通知他们。将向他们发送传真,电子邮件并创建票证以在内部跟踪问题。在for循环中,每个客户将发生3个不同的服务调用。 如果那里的任何地方发生错误,则可能会例如将传真和电子邮件发送给客户,但不会创建故障单。或更糟糕的是,此Cron作业可能包含一个错误,导致每次都在同一时间失败,并反复向同一位客户发送电子邮件。如果所有库都是本地的,则所有内容都可以包装在事务中,而不会发生任何事情。但是在此示例中,我们使用的是Web服务。 请注意,电子邮件和传真方法实际上将数据插入到数据库支持的队列表中,而这些表又由单独的cron作业进程处理。因此,如果需要,可以免费中止对“发送电子邮件”和“发送传真”服务方法的调用。 一种选择是将整个代码块放在Web服务本身中,以便Web服务本身将在事务中调用电子邮件,传真和票证创建方法。但是随后我们创建了一个仅用于事务处理的Web服务方法。没有确凿的理由,我们实际上需要从该cron脚本之外的任何地方调用此方法。 您通常将如何处理此方法?

7
为什么小的固定词汇表被视为RESTful服务的优势?
因此,RESTful服务的词汇表中有一组固定的动词。RESTful Web服务从HTTP方法获取这些信息。定义固定的词汇表具有一些假定的优势,但是我并不十分了解这一点。也许有人可以解释。 为什么REST概述的固定词汇表比为每个状态动态定义词汇表更好?例如,面向对象的编程是一种流行的范例。RPC是用来定义固定接口的,但是我不知道为什么人们会认为RPC受这些限制的限制。我们可以动态指定接口,就像RESTful服务动态描述其内容结构一样。 REST被认为是有利的,因为它可以在不扩展词汇量的情况下增长。RESTful服务通过添加更多资源而动态增长。通过动态指定每个对象的词汇表来扩展服务有什么问题?我们为什么不只使用在对象上定义的方法作为词汇,而让我们的服务向客户描述这些方法是什么以及它们是否有副作用? 从本质上讲,我感觉到服务器端资源结构的描述等同于词汇表的定义,但是随后我们被迫使用有限的词汇表来与这些资源进行交互。 固定的词汇量真的能使客户端的关注与服务器的关注脱钩吗?我当然必须关心服务器的某些配置,这通常是RESTful服务中的资源位置。抱怨使用动态词汇似乎不公平,因为无论如何我们都必须动态地推理如何理解这种配置。RESTful服务描述了您可以通过超媒体识别对象结构而进行的转换。 我只是不明白什么使固定的词汇表比任何自我描述的动态词汇表更好,后者可以在类似RPC的服务中很好地工作。这仅仅是限制HTTP协议词汇量的不好理由吗? 反射 只是为了澄清我的想法比我做的更好。假设您正在设计任何通用的API,甚至可能都不是面向Web的。如果有人说您只能在对象上使用这些方法名称,您会感到高兴吗?REST不仅限于HTTP,而是考虑您编写的每个API,面向Web或以其他方式仅由包含GET POST PUT和DELETE方法的对象组成的API的情况。因此,您无法定义该object.foo方法。您必须定义一个名为foo的新对象,并调用其GET方法。从本质上讲,这就是REST的工作方式,这让我有些不舒服。您对foo的作用没有更好的一般理解,只是被迫为本质上是父对象上的方法创建一个新对象。此外,您的API同样复杂,通过创建更多对象,您隐藏了接口的复杂性。RESTful Web服务迫使我们采用一个接口,该接口在我们要公开的API上下文中可能足够,也可能不够。也许有很好的理由使用面向Web的API来执行此操作,但是有理由不为每个通用API中的每个对象采用标准接口。一个实际的例子将不胜感激。

3
对使用Web服务的基于桌面的客户端进行脱机故障转移的最佳方法是什么?
我有三个共享相同问题的新项目: 他们需要在Web系统上具有逻辑,并且他们需要通过RESTful Web服务与此类系统进行通信的本地应用程序(例如销售点)。 我的解决方案 我设法提出的解决方案是在桌面应用程序消息队列中实现,以在服务离线时存储操作,更准确地说是异步消息队列。但是,这很容易(如果这是最佳解决方案)。我还关注数据同步和冲突解决。 主要系统必须基于Web,因为利益相关者需要使用Web应用程序来进行报告和监视,并且Web服务将处理多个机构的请求。 桌面客户端(最好是瘦客户端)将使用Java(更具体地讲是Netbeans)实现,而Web系统将使用Symfony2实现。其中两个项目需要客户端进行硬件集成,因此使用Web技术制作桌面应用程序(例如Appcelerator Titanium)可能会很麻烦。 我的问题 什么是可扩展的更好解决方案,这意味着以最小的努力获得最高的效率(最好没有额外的成本,例如购买备用服务器进行本地操作)? 以前还有谁处理过?您是如何解决您的问题的?您可以分享什么课程? 您如何处理同步? 编辑:在第3点中向我的问题添加了缺失的部分

3
部署Web应用程序的系统的健康检查的范围应该是什么?
今天,我有一项任务是为长期运行的服务“编写运行状况检查”,该服务是用于部署Web应用程序的业务流程系统。 我试图确定这种健康检查的范围,并提出了与健康检查范围有关的以下问题: 如果业务流程系统报告任务正在运行,则认为服务正常是否足够好? 还是我们应该手动ping每个服务? 还是应该走得更远,并尝试确保网络应用按照显示网页的目的进行操作? 运行状况检查是否还必须检查某些依赖服务是否也在运行?就像数据库或业务流程系统本身一样。还是其他健康检查的责任? 最后,如果其中一项从属服务失效,并且Web应用程序随后发生故障,那么Web应用程序应该报告不良运行状况还是良好运行状况,因为这不是Web应用程序的故障? 我知道这是5个独立的问题,但是它们都与部署Web应用程序的长期运行服务的运行状况检查范围有关,因此我认为将它们分组在一个问题中会更有意义。 这对我来说很难实现,因为我不确定什么是健康的定义或类似标准的健康检查应该是什么样。 此特定服务的健康检查应包含哪些内容?

1
我什么时候应该使用AtomPub?
我一直在进行有关RESTful Web服务设计的研究,我已经达到了我认为是关键的决策点,因此我想将其提供给社区以获取一些建议。 为了遵循RESTful架构的原则,我想提供一个可发现的API,因此我将尽可能全面地支持各种HTTP动词。我的困难在于选择这些资源的表示形式。您会发现,我很容易想出自己的API,该API涵盖了如何显示搜索结果以及如何提供与其他资源的链接,但这对我的应用程序来说是唯一的。 我已经阅读了有关Atom发布协议(RFC 5023)的信息,以及OData如何促进其使用,但它似乎为(当前)一个相当简单的API增加了额外的抽象层次。 所以我的问题是,开发人员何时应该选择AtomPub作为表示形式的选择-如果有的话?如果不是,当前推荐的方法是什么?

1
REST Web服务的身份验证/访问控制的软件体系结构
我正在设置一个新的RESTful Web服务,我需要提供一个基于角色的访问控制模型。我需要创建一个体系结构,该体系结构将允许用户提供用户名和密码来访问服务,然后根据角色限制他们如何使用服务(可以使用哪些服务,读取与读取/写入等)。分配给该用户。 我环顾了其他问题,发现了我想要的东西。例如,关于如何处理将凭证传递到REST服务的静态身份验证,最佳实践等方面,存在许多精彩的讨论。关于创建网站时程序员应了解的知识(每个开发人员在构建公共网站之前应了解的知识),也有一些很好的指导。 但是我找不到关于实现这些解决方案的软件体系结构的最佳实践和模式的好文章,文章和书。 特别: 用户信息和访问权限应如何存储?(数据模型,位置,格式) 有哪些好的设计模式可以表示和跟踪服务器中的这些模式?(内存中的会话,每次数据库查找等) 在代码库中以哪种安全方式将这些权利映射到服务的良好模式是什么? 哪些架构选择可以帮助保持系统更安全和可靠? 人们从战es中学到了什么? 我正在寻找针对任何特定技术之外的软件体系结构的设计模式和建议。 (如果技术很重要,我计划使用python,twisted和postgresql数据库来实现)

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

7
通过HTTPS进行身份验证会降低我的应用程序速度吗?
我正在构建一个Web应用程序和RESTful Web服务。 我一直在阅读有关如何验证对Web服务的请求的最佳方法的各种文章。 对我而言,最好的选择似乎是使用HTTP基本身份验证。我阅读的几乎每篇文章都说,身份验证应该通过SSL或等效协议进行加密。 我不太确定这涉及什么。这是否意味着我的整个Web服务必须位于安全的服务器上?这会减慢速度吗?

4
如果微服务架构需要每个微服务单独的数据库,那么它的成本太高且难以管理。为什么我们甚至需要它?
我读到有关微服务的信息,对于每个服务创建一个单独的DB来实现隔离似乎不合逻辑。我可以仅使用Web服务和单个数据库来实现相同的目的。为什么我们甚至需要它?分开数据库的东西是无聊的。还是我明明是错?你能指导我吗?

3
如果使用Firebase,在哪里放置业务逻辑?
我将开始开发一个单页面Web应用程序,该应用程序非常简化了多用户文档系统。前端可能会使用Angular2。 该项目的期限很短,因此我一直在寻找“捷径”,即使用各种现成的服务,而不是从头开始实现所有内容。 我将需要某种后端来存储应用程序数据。我环顾四周,发现Firebase,它似乎取消了创建单独的后端和API以与前端通信的工作。 但这也意味着我必须将业务逻辑放在Angular2 Web应用程序的前端,对吗? 因此,如果我将来某天想做一个移动应用程序的前端,我是否必须复制业务逻辑代码? 我想替代方案是创建一个包含业务逻辑并使用Firebase进行数据存储的后端,但这似乎有点不可思议(我不能只在后端使用ORM或其他东西来获得相同的结果,而无需还有很多工作吗?) 例如,如果人们想使用Firebase,人们通常如何构造这类应用程序?

3
实体框架实体-来自Web服务的一些数据-最佳体系结构?
当前,我们在多个Web应用程序中使用Entity Framework作为ORM,并且到目前为止,由于我们的所有数据都存储在单个数据库中,因此它非常适合我们。我们正在使用存储库模式,并具有使用它们的服务(域层),并将EF实体直接返回到ASP.NET MVC控制器。 但是,提出了使用第三方API(通过Web服务)的要求,这将为我们提供与数据库中与用户相关的额外信息。在我们的本地用户数据库中,我们将存储一个外部ID,我们可以将其提供给API以获取其他信息。有很多可用的信息,但是为了简单起见,其中之一与用户的公司有关(名称,经理,房间,职务,位置等)。此信息将在整个Web应用程序的各个位置使用-而不是在单个位置使用。 所以我的问题是,填充和访问此信息的最佳位置是哪里?由于它已在各个地方使用,因此无论我们在Web应用程序中使用的何处,都临时地获取它并不明智,因此从域层返回这些附加数据是有意义的。 我最初的想法只是创建一个包含EF实体(EFUser)的包装模型类,以及一个包含新信息的新'ApiUser'类-当我们获取用户时,我们获取EFUser,然后获取其他来自API的信息,并填充ApiUser对象。但是,虽然这对于获得单个用户来说是不错的选择,但在获得多个用户时却会失败。获取用户列表时,我们无法点击API。 我的第二个想法只是向EFUser实体添加一个单例方法,该实体返回ApiUser,并在需要时填充它。这解决了上述问题,因为我们仅在需要时才访问它。 或最终的想法是将数据的本地副本保留在我们的数据库中,并在用户登录时将其与API同步。这是最小的工作,因为这只是一个同步过程-而且我们没有点击的开销每当我们想要获取用户信息时,数据库和API。但是,这意味着将数据存储在两个位置,也意味着该数据对于已经一段时间没有登录的任何用户而言都是过时的。 是否有人对如何最好地处理这种情况有任何建议或建议?

1
处理异步相互通信的最佳实践?
最近完成了一个处理信用卡处理的项目。我面临的困难之一是处理通知消息的延迟/可能失败。最复杂的示例是: 发送付款请求的外部系统 我的系统将该请求转换为对支付网关的请求 将用户发送到网关 等待用户执行付款 用户返回我的系统,但是一直被保留,直到系统收到成功/失败通知 根据故障将用户发送回外部系统 更加困难的事实是,一旦发送通知失败,网关将尝试每15分钟发送通知数小时。 我使用未决事务的数据库记录解决了它,然后从返回中加上成功的延迟侦听器(用于通知和事务处理)来检测返回的成功和失败... 相当困难! 但是,这一定已经解决了无数次,所以最佳实践是什么? 我看到我的未来将是编写所有这些系统之间的处理程序,并管理时间延迟和可能的网络故障,因此我希望遵循最佳实践。 书籍/文章推荐会很棒。 提前致谢!

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.