我在使用 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}\nRun 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{"Price": 600.00}{"Category": "Electronics"}但是,如果您发送此信息,它会返回 200/OK,但不会进行更新,库存仍保持原始值
\n\n{"Stock": 4}我的控制器代码是相当标准的样板代码(来自脚手架的 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) 我正在尝试将新的父文件夹添加到我的大量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) 我正在开发一个 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 标头。" }
我在这个网站上读到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 正确发送补丁请求?
我有一个以ODataAdaptor作为数据源的组件,现在我想像我为 GET 请求所做的那样使用$expand查询发出Patch请求(因为 GET 请求公开支持 $expand 查询)。但我不知道它是否被接受,或者有没有其他方法可以解决这个问题?
实际请求:http://localhost:49807/odata/Orders(10249)
预期请求:http://localhost:49807/odata/Orders(10249)/ ?$expand=OrderDetail($select=CustomerID)
在补丁请求中使用 $expand 查询。
尝试查看哪些模型最适合api(低更新,但对象结构可能经常更改,高读取应用程序)
我有这样的资源
如果我只需要支持这些更新,
这有道理吗?
PATCH 和 application/merge-patch+json RFC 7396
资源应该匹配目标对象结构
PATCHwithapplication/json -我倾向于选择这个,因为没有必要如此严格地执行RFC 7396和灵活地更新更新规则。
您要更新的自定义规则(但从技术上讲 - 我可以只发送需要更新的资源属性类似于application/merge-patch+json)
PUT 和 application/json
资源应匹配所有字段并创建新对象并替换(或作弊并仅像在补丁中一样更新)
PUT 和 application/json
或作弊,只像在补丁中一样更新,但使用 put
我正在使用 .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) 我想使用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 的好方法。
我已经使用 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) 在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开发人员提供这些选项以及它的用途是什么?你能举例说明它的使用吗?
我正在尝试在我的客户端使用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)
所以我有几个问题:
http-patch ×10
rest ×4
c# ×3
http ×3
java ×2
jax-rs ×2
postman ×2
.net-core ×1
asp.net ×1
azure ×1
backbone.js ×1
cxf ×1
flask ×1
google-api ×1
httpclient ×1
integer ×1
javascript ×1
jsonpath ×1
mongodb ×1
odata ×1
odata-v4 ×1
patch ×1
python-3.x ×1
sync ×1