标签: http-patch

Web API 2 不处理整数的 PATCH 请求

我在使用 Web API 2 (.net 4.5.1) 时遇到问题,因为它似乎忽略属性为整数的 PATCH 请求,但处理其他类型时没有问题(我已经测试了字符串和小数) 。

\n\n

我\xe2\x80\x99在http://playapi.azurewebsites.net/api/products上设置了一个带有“products”控制器的不安全测试 API 。如果您对该 URL 执行 GET,您\xe2\x80\x99 将得到类似以下产品的信息:

\n\n
{"Id": 1,"Name": "Xbox One","Category": "gaming","Price": 300,"Stock": 5}\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xe2\x80\x98Name\xe2\x80\x99 和 \xe2\x80\x98Category\xe2\x80\x99 都是字符串,\xe2\x80\x98Price\xe2\x80\x99 是 Decimal,\xe2\x80\ x98Stock\xe2\x80\x99 是一个整数。

\n\n

如果您发送这些请求,它们都会起作用(您\xe2\x80\x99将获得更新实体的 200/OK):

\n\n\n\n

但是,如果您发送此信息,它会返回 200/OK,但不会进行更新,库存仍保持原始值

\n\n\n\n

我的控制器代码是相当标准的样板代码(来自脚手架的 ODATA 控制器,但移至标准 API 控制器):

\n\n
// PATCH: api/Products/5\n[AcceptVerbs("PATCH", "MERGE")]\npublic async Task<IHttpActionResult> PatchOrder(int id, Delta<Product> patch)\n{\n …
Run Code Online (Sandbox Code Playgroud)

asp.net rest integer asp.net-web-api http-patch

5
推荐指数
1
解决办法
3360
查看次数

当批处理中有多个PATCH请求时,为什么我的Drive API请求失败?

我正在尝试将新的父文件夹添加到我的大量Google云端硬盘文件中.我正在使用批处理请求以避免发送太多请求,但是当批处理中添加了多个PATCH请求时,这不起作用.Google服务器正在返回502 Bad GatewayHTTP错误响应.有什么问题或者我该如何解决这个问题?

一般:

Remote Address:216.58.196.138:443
Request URL:https://content.googleapis.com/batch
Request Method:POST
Status Code:502 OK
Run Code Online (Sandbox Code Playgroud)

响应标头:

alt-svc:quic=":443"; ma=604800; v="30,29,28,27,26,25"
alternate-protocol:443:quic,p=1
content-length:1613
content-type:text/html; charset=UTF-8
date:Tue, 01 Dec 2015 06:18:36 GMT
server:GFE/2.0
status:502
Run Code Online (Sandbox Code Playgroud)

请求标头:

:authority:content.googleapis.com
:method:POST
:path:/batch
:scheme:https
accept:*/*
accept-encoding:gzip, deflate
accept-language:ru,en-US;q=0.8,en;q=0.6,de;q=0.4,pt;q=0.2,uk;q=0.2,it;q=0.2
authorization:Bearer ya29.PQI-rcaU2_Pd7tq3XufXVWPfje4ioMzBLhvKOieYuFgs2MnxTyQvtJ0QDR7EiWnN5SOPlGo
content-length:2291
content-type:multipart/mixed; boundary=batch691088898561756483
dnt:1
origin:https://content.googleapis.com
referer:https://content.googleapis.com/static/proxy.html?jsh=m%3B%2F_%2Fscs%2Fapps-static%2F_%2Fjs%2Fk%3Doz.gapi.en.Dm6zFqHZO9M.O%2Fm%3D__features__%2Fam%3DAQ%2Frt%3Dj%2Fd%3D1%2Ft%3Dzcms%2Frs%3DAGLTcCPQ-9iC9Y-vGIOJ-RoQCZkFL66QXw
user-agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36
x-chrome-uma-enabled:1
x-client-data:CKW2yQEIqbbJAQjEtskBCPCIygEI/ZXKAQi8mMoB
x-clientdetails:appVersion=5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_10_3)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F46.0.2490.86%20Safari%2F537.36&platform=MacIntel&userAgent=Mozilla%2F5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_10_3)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F46.0.2490.86%20Safari%2F537.36
x-goog-encode-response-if-executable:base64
x-javascript-user-agent:google-api-javascript-client/1.1.0-beta
x-origin:http://app.local
x-referer:http://app.local
Run Code Online (Sandbox Code Playgroud)

请求负载:

--batch691088898561756483
Content-Type: application/http
Content-Transfer-Encoding: binary
Content-ID: <0B28tlN6SgYRacHVwdEQ5b1RtZmc>

PATCH /drive/v2/files/0B28tlN6SgYRacHVwdEQ5b1RtZmc?addParents=0B28tlN6SgYRaS2syM1VGWjllMnc
X-JavaScript-User-Agent: google-api-javascript-client/0.1 …
Run Code Online (Sandbox Code Playgroud)

http google-api google-drive-api http-patch

5
推荐指数
1
解决办法
470
查看次数

在 Postman 中使用 HTTP PATCH 动词更新数据库表

我正在开发一个 Azure 移动服务,其中包含一个带有 Patch 方法的表控制器:

public Task<User> PatchUser(string id, Delta<User> patch)
{
    return UpdateAsync(id, patch);
}
Run Code Online (Sandbox Code Playgroud)

我在本地托管我的移动服务并想测试 Patch 的工作方式。我正在使用 Postman 来做到这一点,但我不断收到 HTTP 错误 400,并显示以下响应:

{ "message": "HTTP 请求不包含有效的实体主体。请确保请求中存在实体主体和关联的 Content-Type 标头。" }

这些是我附加到 HTTP PATCH 请求的标头: 在此处输入图片说明

这是请求正文: 在此处输入图片说明

我在这个网站上读到POST 请求需要包含这样的正文:[ { "op": "replace", "path": "/email", "value": "new.email@example.org" } ]

如果我提供您可以在下面的屏幕截图中看到的请求正文,我仍然会得到相同的响应:

在此处输入图片说明

这是表控制器所基于的类 User:

public class User : EntityData
{
    public string Gender { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我应该如何通过 Postman 正确发送补丁请求?

c# http azure http-patch postman

5
推荐指数
1
解决办法
7415
查看次数

在 CRUD 操作期间,Odata 适配器是否支持带有“$expand”查询的“Patch”请求?

我有一个以ODataAdaptor作为数据源的组件,现在我想像我为 GET 请求所做的那样使用$expand查询发出Patch请求(因为 GET 请求公开支持 $expand 查询)。但我不知道它是否被接受,或者有没有其他方法可以解决这个问题?

实际请求:http://localhost:49807/odata/Orders(10249)

预期请求:http://localhost:49807/odata/Orders(10249)/ ?$expand=OrderDetail($select=CustomerID)

在补丁请求中使用 $expand 查询。

odata http-patch odata-v4

5
推荐指数
1
解决办法
143
查看次数

补丁与合并补丁哪个合适?

尝试查看哪些模型最适合api(低更新,但对象结构可能经常更改,高读取应用程序)

我有这样的资源

  1. 史诗(id、名称、描述、开始日期、结束日期、状态、 故事
  2. 故事(ID、名称、描述、开始日期、结束日期、状态、任务
  3. 任务(id、名称、描述、开始日期、解决日期、解决方案)

如果我只需要支持这些更新,

  1. 更新史诗名称或描述或日期或状态
  2. 更新故事名称或描述或日期或状态
  3. 更新任务名称或描述或日期或状态

这有道理吗?

PATCHapplication/merge-patch+json RFC 7396

资源应该匹配目标对象结构

  1. 史诗/{id}
  2. 史诗/{id1}/stories/{id2} .. 等等

PATCHwithapplication/json -我倾向于选择这个,因为没有必要如此严格地执行RFC 7396和灵活地更新更新规则。

您要更新的自定义规则(但从技术上讲 - 我可以只发送需要更新的资源属性类似于application/merge-patch+json

  1. 史诗/{id}
  2. 史诗/{id1}/stories/{id2} .. 等等

PUTapplication/json

资源应匹配所有字段并创建新对象并替换(或作弊并仅像在补丁中一样更新)

  1. 史诗/{id}
  2. 史诗/{id1}/stories/{id2} .. 等等

PUTapplication/json

或作弊,只像在补丁中一样更新,但使用 put

  1. 史诗/{id}
  2. 史诗/{id1}/stories/{id2} .. 等等

java rest http jax-rs http-patch

5
推荐指数
1
解决办法
5848
查看次数

API Patch 方法返回错误请求 400

我正在使用 .net core web api。在我的 API 控制器类中有PATCH如下方法,

[HttpPatch("updateMessageTemplate/{templateId}")]
public IActionResult UpdateMessageTemplate([FromHeader] int tenantId, int templateId,[FromBody] testClass msg)
{
    try
    {
        //Some implementation is here
        return Accepted();
    }
    catch
    {
        return StatusCode(500);
    }
}
Run Code Online (Sandbox Code Playgroud)

testClass如下,

public class testClass
{
    public string body { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我从邮递员调用 API,它返回 400 BadRequest。

在此输入图像描述 在此输入图像描述

我在控制器方法中放置了断点,但它没有命中。在我[FromBody] testClass msg从方法参数中删除了断点命中而不返回之后400。为什么我使用时它返回 400 [FromBody] testClass msg?我如何从 HTTP 客户端调用这个控制器方法?

我尝试了这个,它也返回 400 BadRequest

string serviceUrl = string.Format("{0}/notification/updateMessageTemplate/{1}", ConfigurationManager.AppSettings["LtApiUrl"], templateID);

string json = "[{\"body\":\"sample …
Run Code Online (Sandbox Code Playgroud)

c# httpclient http-patch postman asp.net-core-webapi

5
推荐指数
1
解决办法
7426
查看次数

将 json 补丁应用到 mongodb 文档

我想使用Python Flask框架实现HTTP PATCH。作为输入,我将收到如下 JSON 补丁:

[
  { "op": "replace", "path": "/work/title", "value": "Senior Engineer" }
]
Run Code Online (Sandbox Code Playgroud)

我的数据库是 MongoDB,我想将上述补丁直接应用到 Mongo。例如,下面是 Mongo 中存储的文档:

{  
   "name":"ABC",
   "age":25,
   "work":{  
      "title":"Engineer",
      "company":"XYZ"
   }
}
Run Code Online (Sandbox Code Playgroud)

应用补丁后,它应该是:

{  
   "name":"ABC",
   "age":25,
   "work":{  
      "title":"Senior Engineer",
      "company":"XYZ"
   }
}
Run Code Online (Sandbox Code Playgroud)

您能帮我找到一种实施方法吗?

根据我的研究,我发现了一个Python模块python-json-patch,它有助于将 json 应用到 json 对象的补丁中。因此,我们需要从 MongoDB 获取 json/document 并使用上述模块应用补丁。然后将文档替换回 MongoDB 中。所以,基本上这会以 PUT 而不是 PATCH 的形式结束。

另一种方法是我认为有一个模块来解析 json 补丁并构建 json 并使用$set将更新应用到 MongoDB将更新应用到 MongoDB 。但这种方法很幼稚而且效率不高。

因此,请建议一种使用 json patch 并直接应用于 MongoDB 文档来实现 HTTP PATCH 的好方法。

mongodb jsonpath flask python-3.x http-patch

5
推荐指数
0
解决办法
2228
查看次数

使用 HTTPClient 的 C# HTTP 补丁

我已经使用 dot net core 3.1 中的测试服务器编写了一个测试,并且正在尝试向端点发出 PATCH 请求。然而,由于我是使用 PATCH 的新手,我对如何发送端点期望的正确对象有点困惑。

[Fact]
public async Task Patch()
{
    var operations = new List<Operation>
    {
        new Operation("replace", "entryId", "'attendance ui", 5)
    };

    var jsonPatchDocument = new JsonPatchDocument(operations, new DefaultContractResolver());

        
    // Act
    var content = new StringContent(JsonConvert.SerializeObject(jsonPatchDocument), Encoding.UTF8, "application/json");
    var httpResponse = await HttpClient.PatchAsync($"v1/Entry/1", content);
    var actual = await httpResponse.Content.ReadAsStringAsync();
        
}

[HttpPatch("{entryId}")]
public async Task<ActionResult> Patch(int entryId, [FromBody] JsonPatchDocument<EntryModel> patchDocument)
{
    if (patchDocument == null)
       {
           return BadRequest();
       }

       var existingEntry = _mapper.Map<EntryModel>(await _entryService.Get(entryId)); …
Run Code Online (Sandbox Code Playgroud)

c# patch http-patch .net-core

5
推荐指数
1
解决办法
1万
查看次数

如何使用Backbone.js部分更新(补丁:true)?

Model章节的save方法中,Backbone.js文档说:

相反,如果您只想将更改的属性发送到服务器,请调用model.save(attrs,{patch:true}).只有传入的属性,您将收到服务器的HTTP PATCH请求.

资料来源:http://backbonejs.org/#Model-save

我找不到这个实际工作方式的好解释(如果它确实有效!).它应该仅使用传入的属性向服务器发送PATCH请求,但它总是向服务器发送POST请求将模型的所有属性.使用Firebug,我在更改时看不到任何差异Backbone.emulateHTTP:Firebug始终使用save方法显示POST请求.

我在这里创建了一个测试:http://jsfiddle.net/r9kXL/ 注意,url当然不存在,但重要的是在Firebug中查看POST请求.如您所见,如果您尝试仅发送一个属性,它将始终将所有内容发送到服务器,使选项完全无用.

为什么Backbone开发人员提供这些选项以及它的用途是什么?你能举例说明它的使用吗?

javascript rest sync backbone.js http-patch

4
推荐指数
1
解决办法
5303
查看次数

如何在CXF中使用PATCH方法

我正在尝试在我的客户端使用PATCH方法使用JAX-RS的CXF实现.起初我将PATCH注释定义为

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@HttpMethod("PATCH")
public @interface PATCH {
}
Run Code Online (Sandbox Code Playgroud)

引用这里写的内容: 如何为JAX-RS提供@PATCH注释?

然后我发现@PATCH被添加到CXF 3.1.2中,所以我在我的maven的pom.xml中更改了版本,确实有public @interface PATCH内部版本,package org.apache.cxf.jaxrs.ext;代码实际上看起来与我上面发布的完全相同.

但是,当我尝试在我的服务定义上使用此注释时

@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public interface AbcService {

    @PATCH
    @Path("/abc/efg")
    public SomeDTO patchSomething(RequestObject request);
}
Run Code Online (Sandbox Code Playgroud)

我最终得到了java.net.ProtocolException: Invalid HTTP method: PATCH上面发布的queston链接中的说法.他们用Jersey讨论了一些解决方案,但是我可以在CXF中做什么,以便我可以使用:

AbcService abcService = JAXRSClientFactory.create(myURI, AbcService.class, myProviders, true);
abcService.patchSomething(new RequestObject('something'));
Run Code Online (Sandbox Code Playgroud)

所以我有几个问题:

  1. 我怎样才能做到这一点?不,我需要编写自定义CXF拦截器?
  2. 为什么如果它不起作用,他们会将PATCH注释添加到CXF中?
  3. 另一个话题中的一些人说,提到的PATCH注释定义适用于他们.怎么会 ?它只会在客户端造成麻烦,如果是这样,为什么呢?
  4. 为什么我在CXF文档中找不到这个注释?我查看了http://cxf.apache.org/javadoc/latest/上的 org.apache.cxf.jaxrs.ext包,但是我没有看到任何PATCH.然而在最新的cxf 3.1.2中我真的可以在这个包中找到它.

java rest cxf jax-rs http-patch

4
推荐指数
1
解决办法
3009
查看次数