- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
假设有人在我的端点上执行了一个PUT
请求:
/resources/{id}
但是,在我的 PostgreSQL 数据库中没有存储具有给定 ID 的资源。
根据RFC 2616 ,如果我有能力,我应该创建资源:
The
PUT
method requests that the enclosed entity be stored under the supplied Request-URI. If the Request-URI refers to an already existing resource, the enclosed entity SHOULD be considered as a modified version of the one residing on the origin server. If the Request-URI does not point to an existing resource, and that URI is capable of being defined as a new resource by the requesting user agent, the origin server can create the resource with that URI.
可以使用提供的 ID 创建资源吗?因为在数据库插入时手动分配 ID 不是最佳实践。
如果无法创建资源,我是否应该返回 404
错误?
最佳答案
首先,您使用的是过时文档:RFC 2616 如今已不再适用,任何使用此类文档作为引用的人都应该立即停止。 p>
引用 Mark Nottingham在撰写本文时,谁是 IETF HTTP 和 QUIC 工作组的联合主席:
Don’t use RFC2616. Delete it from your hard drives, bookmarks, and burn (or responsibly recycle) any copies that are printed out.
旧的 RFC 2616 已被以下文档所取代,这些文档共同定义了 HTTP/1.1 协议(protocol):
如果您正在寻找方法、状态代码和 header 定义,那么 RFC 7231是您应该引用的文档。
话虽如此,让我们回到您的问题。
Should HTTP
PUT
create a resource if it does not exist?
视情况而定。
但是,如果您的应用程序代表客户端生成资源标识符,正如您在问题中提到的,那么您应该使用 POST
而不是 PUT
用于创建资源。
PUT
的某些部分方法定义引用如下。最后一句话似乎与你最相关(highlight 是我的),支持我上面刚刚提到的内容:
The
PUT
method requests that the state of the target resource be created or replaced with the state defined by the representation enclosed in the request message payload. [...]If the target resource does not have a current representation and the
PUT
successfully creates one, then the origin server MUST inform the user agent by sending a201
(Created) response. If the target resource does have a current representation and that representation is successfully modified in accordance with the state of the enclosed representation, then the origin server MUST send either a200
(OK) or a204
(No Content) response to indicate successful completion of the request. [...]Proper interpretation of a
PUT
request presumes that the user agent knows which target resource is desired. A service that selects a proper URI on behalf of the client, after receiving a state-changing request, SHOULD be implemented using thePOST
method rather thanPUT
. [...]
Should I return a
404
error if the creation of the resource is not possible?
这似乎是要返回的准确状态代码,因为没有找到所请求资源的表示形式:
The
404
(Not Found) status code indicates that the origin server did not find a current representation for the target resource or is not willing to disclose that one exists. [...]
现在,为了完整起见,请在下面找到关于 POST
的一些相关引述。方法定义,应该用于在您的问题中描述的场景中创建资源:
The
POST
method requests that the target resource process the representation enclosed in the request according to the resource's own specific semantics. For example,POST
is used for the following functions (among others):[...]
- Creating a new resource that has yet to be identified by the origin server;
[...]
If one or more resources has been created on the origin server as a result of successfully processing a
POST
request, the origin server SHOULD send a201
(Created) response containing aLocation
header field that provides an identifier for the primary resource created and a representation that describes the status of the request while referring to the new resource(s).
虽然201
状态代码表示已创建新资源,Location
header 指示新创建的资源所在的位置。如果没有 Location
提供了 header ,那么客户端应该假定该资源是由有效请求 URI 标识的:
The
201
(Created) status code indicates that the request has been fulfilled and has resulted in one or more new resources being created. The primary resource created by the request is identified by either aLocation
header field in the response or, if noLocation
field is received, by the effective request URI. [...]
关于rest - 如果资源不存在,HTTP PUT 是否应该创建资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56240547/
我正在处理批处理作业,以通过 HTableInterface 将一批 Put 对象处理到 HBase 中。有两个 API 方法,HTableInterface.put(List) 和 HTableIn
我想转置curl命令(将本地文件上传到机架空间) curl -X PUT -T screenies/hello.jpg -D - \ -H "X-Auth-Token: fc81aaa6-98a1-9
我认为执行 puts #{a} 会产生与 puts a 相同的输出,但发现情况并非如此。考虑: irb(main):001:0> a = [1,2] => [1, 2] irb(main):002:0
我尝试在我的一个移动应用程序中使用这个cordova后台服务插件(我正在使用名为Appery io的基于网络的移动应用程序开发平台)。我已经能够让相当多的 cordova/phonegap 插件正常工
传奇有多个 put。 export function* changeItemsSaga(action) { const prerequisite1 = yield select(prerequ
我正在从工作正常的 jquery $.ajax 切换到使用 AngularJS $http.put 来访问 Restful API。 我可以进行 API 调用,但 PUT 数据未发送 - 因此我的 A
我的 express 里有这个 router.put('/admin/profile?:id/actions', (req, res) => { console.log(req.body.action
我正在浏览 Ruby tutorial , 并了解到代码 puts 'start' puts puts 'end' 会输出三行,但是下面的代码 puts 'start' puts [] puts 'e
我的目标是使用 TreeMap 使 Box 键对象按 Box.volume 属性排序,同时能够将键按 Box.code 区分。在 TreeMap 中不可以吗? 根据下面的测试 1,HashMap pu
我一直在尝试使用HBase客户端库将记录列表插入HBase。 它适用于Table或HTable中的单个Put(不建议使用),但不能识别List(Puts) 错误说:预期:util.List,但是Lis
我正在使用 Google-guava-cache。将其定义为: Cache myCache= CacheBuilder.newBuilder().maximumSize(100).build();
我只是想知道threadContext.put和MDC.put之间的区别。因为,我相信两者都在做相同的操作。 最佳答案 Log4j 2 continues with the idea of the M
我的 GAE 应用程序上有一些模型,并且我已覆盖 put()关于其中一些。当我调用db.put()时有了这些实体的列表,是否可以保证覆盖 put()每个实体都会被调用? 我现在看到的是实体只是被保存而
module Lab def self.foo puts 'foo from lab' end end module M def foo puts 'foo from mo
我正在查看示例 abo3.c来自 Insecure Programming我并没有在下面的例子中摸索类型转换。有人可以启发我吗? int main(int argv,char **argc) {
我正在 symfony2.4 和 angularjs 中构建应用程序。在 Angular 中我创建了资源: app.factory('Tasks', ['$resource', function($r
到处都说[看了很多帖子] PUT 是幂等的,意味着具有相同输入的多个请求将产生与第一个请求相同的结果。 但是,如果我们使用 POST 方法发出具有相同输入的相同请求,那么它又将表现为 PUT。 那么,
这里是WebApiConfig.cs中的路由配置: config.Routes.MapHttpRoute( name: "DefaultApiPut", routeTemplate:
这两种方法有什么区别: getInputMap(JComponent.WHEN_FOCUSED).put(KeyStroke.getKeyStroke( "pressed F10"),
由于匿名 block 和散列 block 看起来大致相同。我正在玩它。我做了一些严肃的观察,如下所示: {}.class #=> Hash 好的,这很酷。空 block 被视为Hash。 print{
我是一名优秀的程序员,十分优秀!