我们目前正在处理来自我们巨石的小型服务.我们的域名与票务系统非常相似.我们已决定从域名的取消过程开始.
我们的取消服务具有简单的端点"取消",它接收票证的ID.在内部,我们检索id,执行与取消相关的一些操作,并更新商店中实体的状态.从商店的角度来看,取消的机票和实时机票之间的唯一区别是一些属性.
根据我的阅读,PATCH似乎是在这种情况下使用的正确动词,因为我只更新资源中的一个简单属性.
PATCH /api/tickets/{id}
Payload {isCancelled: true}
Run Code Online (Sandbox Code Playgroud)
但isCancelled不是实体中的实际属性.在有效载荷中发送不属于实体的属性是否公平,还是应该考虑对此请求进行建模的其他形式?我不希望将整个实体作为有效载荷的一部分发送,因为它很大.
我考虑过创建一个新的资源CancelledTickets,但在我们的域名中,我们永远不需要对已取消的门票进行GET.因此,不必创建新资源
任何帮助将不胜感激
谢谢K.
通过阅读Patch动词的RFC规范,很明显Patch动词不应该获得值来部分更新实体,而是要进行操作:
但是,使用PATCH,随附的实体包含一组指令,描述如何修改当前驻留在源服务器上的资源以生成新版本.
在MSDN中,对于Delta类,它也很清楚,因为Patch描述说:
使用此Delta 跟踪的更改覆盖原始实体.
与Put的描述不同:
使用存储在此Delta中的值覆盖原始实体.
到目前为止一切都那么好,但我找不到用OData发送这些"指令"的方法,无论我做什么,Delta.Patch只替换值.
补丁请求的语法应该是什么?
我尝试的方式是:
PATCH http://localhost:55783/Products(1) HTTP/1.1
User-Agent: Fiddler
Host: localhost:55783
Content-Length: 19
Content-type: application/json
{ "Price": 432 }
Run Code Online (Sandbox Code Playgroud)
和
{ "op": "add", "path": "/Price", "value": 423432 }
Run Code Online (Sandbox Code Playgroud)
那附近的东西.
更新:
感谢迈克尔·摩尔和用ILSpy阅读整个Delta课程,我认为它确实是Patch动词设计中的一个错误.
我为微软公开了一个错误,如果您需要修复它,可以对它进行投票.
当我将HTTP PATCH请求放在一起时,在URL参数之外包括数据的选项是什么?
以下任何一项都可以工作,最常见的选择是什么?
简短:是否符合标准,RESTful和其他好主意,以启用PATCH请求来更新资源集合,而不仅仅是单个资源,但仍然是单独的?
长:
我正在考虑公开一种方法,用于对我的资源集合进行批量,原子更新.例:
PATCH /url/myresources
[
{
"op": "add",
"path": "/1", // ID if the individual resource
"value":
{
... full resource representation ...
}
},
{
"op": "remove",
"path": "/2"
},
{
"op": "replace",
"path": "/3/name",
"value": "New name"
}
]
Run Code Online (Sandbox Code Playgroud)
上下文是商业解决方案的公共API.允许这样的PATCH的好处是原子性和批量友好性,没有垃圾邮件请求,单独处理故障等.
我已经咨询了https://tools.ietf.org/html/rfc6902和http://tools.ietf.org/html/rfc5789但是如果符合要求则无法找到明确的答案.RFC主要是指"资源",但也可以将资源集合视为"资源".
这是一个好主意吗?还有更好的选择吗?
我正在使用Jersey进行REST API实现。对于PATCH(部分更新),我已经实现了自己的自定义实现,PATCH因为Jersey不支持它。
现在,我试图弄清楚如何围绕该实现编写功能测试。我使用的球衣测试框架,其他方法(PUT,POST,GET,DELETE)已在该框架提供了支持。
有什么方法可以扩展jersey测试框架的实现来编写我的功能测试PATCH?如果没有,我是否可以使用其他测试框架来测试Jersey的PATCH实现?
如果有人可以提供任何示例,那就太好了。
如果PATCH请求应用于尚不存在的资源,那么它是否允许创建资源,或者在这种情况下是否需要单独的POST/PUT请求?
该PATCH请求将转到网址的资源,例如:PATCH /object/1234.如果ID为1234的对象在数据库中,我将创建它,否则我将更新它.
该PATCH请求不包含所有领域,这就是为什么我不使用PUT.
我有一个 spring boot (version 2.2.6.RELEASE) web 项目。
从这个 Web 应用程序(我称之为“APP1”)我想使用来自另一个 Web 应用程序的 PATCH 方法调用另一个 URI(我们称之为“APP2”)。在我的 pom.xml 中,我有以下依赖项:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
Run Code Online (Sandbox Code Playgroud)
下面是我如何调用其他 Web 应用程序的 PATCH 方法。
@FeignClient(name = "clientName", url = "base-uri")
public interface MyInterface{
@PatchMapping(value = "/target-uri")
void callClientMethod(Map<String, Object> args);
Run Code Online (Sandbox Code Playgroud)
我在互联网上寻找解决方案,并在我的 pom.xml 中添加了以下 snipet
<dependency>
<groupId>com.netflix.feign</groupId> <!-- Also tried io.github.openfeign -->
<artifactId>feign-httpclient</artifactId>
<version>8.18.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
之后,APP2 的 PATCH 方法仍然被正确调用,但在 APP1 中我收到以下错误: java.lang.NoSuchMethodError: feign.Response.create (ILjava/lang/String;Ljava/util/Map;Lfeign/Response$Body;)假/响应;
我想知道是否有可能匹配Happstack中的PATCH请求,除了Method数据类型没有PATCH的构造函数:
data Method
= GET | HEAD | POST | PUT | DELETE | TRACE | OPTIONS | CONNECT
Run Code Online (Sandbox Code Playgroud)
但是,在某些情况下可能会出现对PATCH请求的需求,例如,在使用Backbone.js时它可以很方便.如果可以在不修改Happstack的情况下匹配不同的方法而不是定义的方法,那将是很好的.另外我想知道Happstack是否支持PATCH请求的特殊原因.
真的很困惑这个bug.所有版本的IE,甚至那些支持CORS的版本,在我尝试发出跨域PATCH请求时都会抛出"权限被拒绝"错误(使用jQuery.ajax).所有其他方法(甚至PUT)都能正常工作,但PATCH会在send()调用时触发立即错误.
考虑到IE的后续版本支持CORS,并且据称支持所有方法类型,是否有一些原因导致CORS + PATCH会导致错误?
(是的,Access-Control-Allow-Methods设置为,GET, POST, DELETE, PATCH, PUT, OPTIONS所以我不认为这是问题.)
我正在使用Java中的基本Servlet实现REST Api,但似乎找不到doPatch()方法。
为什么不HttpServlet实现PATCH方法?我想使用它,因为它对于资源更新更有意义。
http-patch ×10
http ×4
rest ×4
api-design ×2
java ×2
.net ×1
api ×1
c# ×1
cors ×1
feign ×1
happstack ×1
haskell ×1
http-verbs ×1
jax-rs ×1
jersey-2.0 ×1
jquery ×1
json ×1
odata ×1
parameters ×1
servlets ×1