- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
请记住,我对REST有基本的了解。假设我有以下网址:
http://api.animals.com/v1/dogs/1/
ACTION http://api.animals.com/v1/dogs/1/
{"action":"bark"}
最佳答案
为什么要针对RESTful设计?
RESTful原则将使Web站点易于使用的(对于随机的人类用户“浏览”它们)引入Web服务API设计中,以便程序员易于使用。 REST isn't good because it's REST, it's good because it's good.很好,主要是因为它是简单。
普通HTTP的简单性(没有SOAP信封和单个URI重载的POST
服务),可以称为,有些人称之为“功能不足”,实际上是其最大的优势。 HTTP立即要求您具有可寻址性和无状态性:这两个基本设计决策使HTTP可以扩展到当今的大型站点(和大型服务)。
但是REST并不是灵丹妙药:有时,RPC风格的(“远程过程调用”,例如SOAP)可能是合适的,并且有时其他需求优先于Web的优点。这可以。我们真正不喜欢的是不必要的复杂性。程序员或公司通常会引入RPC样式的服务来完成普通的旧HTTP可以很好处理的工作。这样做的结果是,HTTP简化为用于巨大XML有效负载的传输协议(protocol),该XML有效负载解释了“真正”发生的事情(不是URI或HTTP方法提供了线索)。最终的服务太复杂了,无法调试,并且除非您的客户具有开发人员想要的精确设置,否则它将无法正常工作。
Java / C#代码不能以面向对象的方式相同,仅使用HTTP不能使设计成为RESTful。 急于考虑关于其服务的服务,其中包括应该采取的措施和远程方法。难怪这最终会以RPC样式服务(或REST-RPC混合)结尾。第一步是要有不同的想法。 RESTful设计可以通过多种方式来实现,一种方式是根据资源而不是操作来考虑应用程序:
💡 Instead of thinking in terms of actions it can perform ("do a search for places on the map")...
...try to think in terms of the results of those actions ("the list of places on the map matching a search criteria").
ACTION http://api.animals.com/v1/dogs/1/
ACTION
)。一般来说,由于以下几个原因,这是不希望的:
ACTION
动词存在? POST
(我将在下面讨论原因,现在就说吧):
POST /v1/dogs/1/ HTTP/1.1
Host: api.animals.com
{"action":"bark"}
{"action":"bark"}
是一个文档;和/v1/dogs/1/
是一个“文档处理器”(类似于工厂)的URI。 “文档处理器”是一个URI,您只需将其“扔给”并“忘记”它们-在“扔”之后,处理器可能会将您重定向到新创建的资源。例如。用于在消息代理服务中发布消息的URI,该服务在发布后会将您重定向到显示消息处理状态的URI。 {"action":"bark"}
不是文件,实际上是您尝试对服务进行忍者访问的方法;和/v1/dogs/1/
URI表示“狗”资源(可能是带有id==1
的狗),而不是文档处理器。 bark
Action 可以 secret 地将POST
注入(inject)其中?A
POST
request is an attempt to create a new resource from an existing one. The existing resource may be the parent of the new one in a data-structure sense, the way the root of a tree is the parent of all its leaf nodes. Or the existing resource may be a special "factory" resource whose only purpose is to generate other resources. The representation sent along with aPOST
request describes the initial state of the new resource. As with PUT, aPOST
request doesn’t need to include a representation at all.
bark
可以建模为的dog
的子资源(因为狗中包含bark
,也就是说,将狗的
吠叫为ok)。POST
/barks
,它是dog的子资源:/v1/dogs/1/barks
,代表一个bark
“factory”。该URI对于每条狗都是唯一的(因为它在/v1/dogs/{id}
下)。 dog.email
发送一封电子邮件,什么也没记录。bark
请求是否需要任何文档(可能是电子邮件),还是空的?dog.email
发送电子邮件,但不记录任何内容(作为同步任务)barks
工厂资源会立即产生一个树皮(发送电子邮件),并立即给出响应(如果确定):POST /v1/dogs/1/barks HTTP/1.1
Host: api.animals.com
Authorization: Basic mAUhhuE08u724bh249a2xaP=
(entity-body is empty - or, if you require a **document**, place it here)
200 OK
200 OK
就足够了。它表明一切都按预期进行。dog.email
发送电子邮件,不记录任何内容(作为异步任务)bark
任务的方法。然后,bark
任务应该是具有自己的URI的资源:POST /v1/dogs/1/barks HTTP/1.1
Host: api.animals.com
Authorization: Basic mAUhhuE08u724bh249a2xaP=
{document body, if needed;
NOTE: when possible, the response SHOULD contain a short hypertext note with a hyperlink
to the newly created resource (bark) URI, the same returned in the Location header
(also notice that, for the 202 status code, the Location header meaning is not
standardized, thus the importance of a hipertext/hyperlink response)}
202 Accepted
Location: http://api.animals.com/v1/dogs/1/barks/a65h44
bark
都是可追溯的。然后,客户端可以向GET
URI发出bark
,以了解其当前状态。甚至可以使用DELETE
取消它。dog.email
发送一封电子邮件,然后将dog.barkCount
递增1dog
资源已更改,那么这可能会比较棘手:POST /v1/dogs/1/barks HTTP/1.1
Host: api.animals.com
Authorization: Basic mAUhhuE08u724bh249a2xaP=
{document body, if needed; when possible, containing a hipertext/hyperlink with the address
in the Location header -- says the standard}
303 See Other
Location: http://api.animals.com/v1/dogs/1
location
header 的目的是让客户端知道他应该看看dog
。从HTTP RFC about 303
:This method exists primarily to allow the output of a
POST
-activated script to redirect the user agent to a selected resource.
bark
子资源,就像1.2
情况一样,并且在任务完成时应在303
处返回GET .../barks/Y
。bark
记录的新“bark.timestamp
”记录。也会使dog.barkCount
增加1。POST /v1/dogs/1/barks HTTP/1.1
Host: api.animals.com
Authorization: Basic mAUhhuE08u724bh249a2xaP=
(document body, if needed)
201 Created
Location: http://api.animals.com/v1/dogs/1/barks/a65h44
bark
是根据请求创建的,因此将应用201 Created
状态。202 Accepted
(as the HTTP RFC says)。bark
资源的一部分,可以使用GET
对其进行检索。更新的狗也可以在该GET dogs/X/barks/Y
中“记录”。dog.owner
发送一条文本消息,告诉他们新的狗代码正在生产中。POST /v1/dogs/1/barks HTTP/1.1
Host: api.animals.com
Authorization: Basic mAUhhuE08u724bh249a2xaP=
(document body, if needed)
202 Accepted
Location: http://api.animals.com/v1/dogs/1/barks/a65h44
GET
发出/v1/dogs/1/barks/a65h44
,以了解当前状态(如果将代码拉出,则将电子邮件发送给所有者等)。每当狗变时,就可以使用303
。The only thing REST requires of methods is that they be uniformly defined for all resources (i.e., so that intermediaries don’t have to know the resource type in order to understand the meaning of the request).
POST
是统一设计的。它将使狗成为“bark
”。这是不安全的(意味着树皮会对资源产生影响),也不是幂等的(每个请求都产生一个新的bark
),这很适合POST
动词。POST
到barks
会产生bark
。响应状态代码(必要时还包含实体正文和 header )可以解释哪些更改以及客户端可以并且应该如何进行。ACTION http://api.animals.com/v1/dogs/1/?action=bark
http://www.google.com/search?q=DOG
为例。那里,方法信息是GET
,作用域信息是/search?q=DOG
。If the HTTP method doesn’t match the method information, the service isn’t RESTful. If the scoping information isn’t in the URI, the service isn’t resource-oriented.
POST
。那里没问题,它可以工作,并且可能是最简单的方法,它是,但这不是RESTful的。example.com/order/123
。POST example.com/order/123?do=cancel
。PUT
的order
元素canceled
来表示true
的新表示形式:PUT /order/123 HTTP/1.1
Content-Type: application/xml
<order id="123">
<customer id="89987">...</customer>
<canceled>true</canceled>
...
</order>
POST /order/123/canceled
的true
。)GET
的/v1/dogs/1/
可能包含该信息(例如<barking>true</barking>
)。或者...如果过于复杂,则放松您的RESTful要求,并坚持使用POST
。/post?lang=en
显然是与/post?lang=jp
相同的资源,只是一种表示形式)。相反,它们用于将客户端状态(类似于?page=10
,以便不将其保留在服务器中;这里?lang=en
也是一个示例)或输入参数传达给算法资源(/search?q=dogs
,/dogs?code=1
)。同样,不是不同的资源。?action=something
的要点:GET
和HEAD
是安全的(幂等); PUT
和DELETE
仅是幂等的; POST
都不是。 GET
或HEAD
请求是对读取一些数据的请求,而不是更改任何服务器状态的请求。客户端可以发出GET
或HEAD
请求10次,这与发出一次或完全不发出相同。DELETE
一次,则再次删除将具有相同的效果(该资源已为GONE
)。POST
既不安全也不幂等。对“工厂”资源进行两个相同的POST
请求可能会导致两个包含相同资源的下级资源POST
,所有选择均关闭。GET
)而没有等待页面完全加载?关于api - 以RESTful方式在资源上调用服务器端方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16877968/
我对编程真的很陌生,并且在理解 RESTful API 的概念时遇到了一些麻烦。我读过 REST 和 RESTful API。我已经查看了 SO 中已经提出的问题,但似乎无法更好地理解该主题。 在我的
我以为我知道REST /“RESTFul”,restfulservices,webservices,SOA和微服务是什么,但是我遇到了许多不同的定义,我得出的结论是这些术语被过度使用,滥用或完全错误定
我有一个列表,其中有一个“人员和组”列。当我使用 REST 查询行时,我会在此列中列出用户 ID。 我发现这篇文章将帮助我将每个 id 转换为标题 http://www.codeproject.com
我想问一些关于 REST 调用的问题。我是 REST 调用的绿色,我想了解什么是 REST 调用以及如何使用 URL 向服务器发送 REST 调用。谁能给我一些基本的教程或链接供我引用? 另外,如果我
很难说出这里问的是什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或言辞激烈,无法以目前的形式合理回答。如需帮助澄清此问题以便可以重新打开,visit the help center . 8年前关闭
如果有一个 REST 资源我想监视来自其他客户端的更改或修改,那么最好(也是最 RESTful)的方法是什么? 我这样做的一个想法是通过提供特定资源来保持连接打开,而不是在资源不(尚)存在时立即返回。
我有一个可以返回大量项目的 RESTful API,我希望能够使用分页样式技术来限制项目数量,这是 RESTful API 中的一个好主意吗? 如果有可能最好通过链接(在这种情况下为 url)或请求正
我仍然处于适应以 REST 方式做事的过程中。 在我的情况下,客户端软件将与 RESTful 服务交互。很少,客户端会上传其整个实体数据库(每个实体序列化为大约 5kb 的 xml 块)。 也许我错了
设计一个路径解析可能有歧义的 REST API 是否被认为是不好的做法?例如: GET /animals/{id} // Returns the animal with the given ID
我知道 REST 并且知道在不使用 session 的情况下创建 RESTful Web 服务,我更了解它,但我不太了解无状态的概念以及使用 REST 如何使您的应用程序可扩展 有人可以解释 REST
我正在尝试找到解决以下问题的最佳方法:我们的应用程序是SaaS,它支持Web登录的SAML。该应用程序还公开了应该在自动化和无人值守的流程中使用的REST API,这意味着没有交互式用户可以键入凭据。
由于 REST 是无状态的,因此传入的每个请求都不知道传入的前一个请求。在这种情况下是否可以使用连接池? 如果要实现连接池,它将像标准数据库连接一样在每个请求时打开连接池并关闭它。 如何实现 REST
得墨忒耳定律(真的应该是得墨忒耳的建议)说你不应该“穿过”一个物体去接触它们的子物体。如果您作为客户需要执行一些重要的操作,大多数情况下您使用的域模型应该支持该操作。 REST 原则上是一个愚蠢的对象
我唯一真正接触到 REST 的想法已经通过 Ruby on Rails 的 RESTful routing .这非常适合我使用 Rails 构建的基于 CRUD 的应用程序,但因此我对 RESTful
有什么好处 http://www.example.com/app/servlet/cat1/cat2/item 网址 超过 http://www.example.com/app/servlet?c
我知道以前有人问过这类问题。我有我的问题的解决方案,我想知道我是否在任何地方破坏了 REST 或 HTTP 主体。 在我的系统中,我有一个名为 member 的资源。支持通常的GET/POST/PUT
我有一个API,可以执行一些批量处理任务。假设它确实为某些资源命名。 我批量传递了7个请求,其中5个更新成功,2个失败。 我的问题是如何应对。使用HTTP时,我无法同时返回成功和错误。 有一个部分成功
我来自 RPC 世界,但目前正在调查使用 REST 是否适合我的项目。至于据我了解 Wikipedia RESTful 服务的基本思想是提供对集合及其各个元素的访问。 在我的情况下,服务器将是一个测量
我想将REST添加到我的挂毯项目中,因此需要知道如何实现它。 有什么更好的方法? 谢谢。 [编辑,从答案中复制:]我必须将GET,PUT,POST和DELETE服务添加到我的挂毯应用程序中。我看到Ta
让 /users/{id}成为 RESTful 服务中的资源 url。 启用基本身份验证,只有经过身份验证的用户才能访问该 url。 示例场景: User_1 & User_2是经过身份验证的用户,用
我是一名优秀的程序员,十分优秀!