这个问题是关于在Delphi XE5中构建的应用程序.
我正在与第三方合作提供一个应用程序,允许用户通过HTTP帖子将信息(JSON格式)更新到第三方的API.如果我将用户信息分成单个对象,我可以使用POST方法,但由于单个事件的数量过程很慢.如果我执行包含多个对象的文件的批量发布,但是api要求我在上传文件与单个对象时使用PATCH谓词要快得多.我可以使用curl这样做,但我想避免必须在每个用户系统上安装curl来执行此操作.
有没有办法在Delphi中使用PATCH动词?Indy似乎没有支持PATCH.
我需要对资源进行异步更新.关于202 Accepted是否是对PATCH的适当回应,是否有明确的陈述?
这里的官方文档,从未提到202,并且似乎假设由于PATCH导致的资源更改是同步进行的,但它从未做出明确的声明.
PATCH操作的适当原理图是什么?
我在 django Rest 框架中使用以下代码来实现放置和修补功能。PATCH (partial_update) 工作正常,但是,为 PUT 提供较少的字段不会像 PUT 请求那样替换整个资源。例如,如果数据如下所示:
{
"id": 6,
"name": "crticial MVP",
"description": "getting things done",
"end": "2012-02-18"
}
Run Code Online (Sandbox Code Playgroud)
如果我尝试使用以下数据进行 PUT(在http://localhost:800/api/sprints/6/上):
{
"name": "critical MVP2",
"end": "2012-02-18"
}
Run Code Online (Sandbox Code Playgroud)
此调用应将描述设置为无。但描述保留了它的价值,就好像我正在做一个补丁一样。如何在更新功能中强制执行资源替换?
PS:我在初始化序列化器进行更新时设置了partial=False。
视图.py:
class SprintViewSet(viewsets.ModelViewSet):
queryset = Sprint.objects.order_by('end')
serializer_class = SprintSerializer
def update(self, request, *args, **kwargs):
sprint=self.get_object()
serializer = SprintSerializer(sprint, data=request.data, partial=False,
context={'request': request, 'view':self, 'format':None})
serializer.is_valid(raise_exception=True)
serializer.save()
return Response(serializer.data)
def partial_update(self, request, *args, **kwargs):
instance = self.get_object()
serializer = SprintSerializer(instance, data=request.data, partial=True,
context={'request': request, 'view':self, …Run Code Online (Sandbox Code Playgroud) django http-put django-serializer django-rest-framework http-patch
在RESTful API中,我拥有用户资源/users,/users/:id包括用户名,电子邮件地址和密码.
当我想更新用户信息时,我可以轻松地PATCH:/users/:id使用一些JSONPatch数据.
现在的问题是,我无法弄清楚如何处理更改密码的情况有currentPassword,newPassword和newPasswordConfirm形成.
应该使用什么方法(PATCH似乎合适但有问题)以及数据应以何种方式传输(正文/标题/ ......).
在更广泛的范围内 - 如何处理具有更多验证字段的补丁.
这篇文章似乎有关,但没有涵盖这个确切的主题.
我正在编写 JUnit 测试,通过 RestTemplate 调用我的应用程序。我已经成功地实现了 GET、POST 和 PUT,但无法运行 PATCH(尽管它在客户端发送 URL 时工作)。例如,使用以下代码运行 POST:
RestTemplate restTemplate = new RestTemplate();
ProductModel postModel = restTemplate.postForObject(TestBase.URL + URL, pModel, ProductModel.class);
Run Code Online (Sandbox Code Playgroud)
但是当我尝试调用 restTemplate.patchForObject() - 我在网上找到的 - STS 返回一个错误,指出该函数未定义。我因此使用了这个:
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<MessageModel> retval = restTemplate.exchange("http://localhost:8080/products/batchUpdateProductPositions",
HttpMethod.PATCH, new HttpEntity<ProductPositionListModel>(pps), MessageModel.class);
Run Code Online (Sandbox Code Playgroud)
它编译,但给了我一个错误:
I/O Error on PATCH request for "http://localhost:8080/products/batchUpdateProductPositions": Invalid HTTP method: PATCH
Run Code Online (Sandbox Code Playgroud)
在应用程序中,我在 Controller 类中定义了操作:
@RequestMapping(value = "/batchUpdateProductPositions", method = RequestMethod.PATCH)
public MessageModel batchUpdatePosition(
@RequestBody ProductPositionListModel productPositionList)
throws Exception {
try {
return productService.batchUpdatePosition(productPositionList);
} …Run Code Online (Sandbox Code Playgroud) 它在HTTP Spec上提到PATCH是not幂等的.
幂等的基本定义是:
幂等HTTP方法是一种HTTP方法,可以多次调用而不会产生不同的结果
所以如果我们进行HTTP调用
PATCH /users/1
{
"username": "dummyUser"
}
Run Code Online (Sandbox Code Playgroud)
无论我们在HTTP端点上面调用多少次,它总是意味着要将username用户更新1为dummyUser.
PATCH对于更新任何资源的1个或多个属性的任何请求,这几乎相同.
那么为什么HTTP Spec指定PATCH是not幂等的呢?
我在dropwizard REST资源上实现了一个PATCH方法.目前只有要修补的资源属性的子集.目前只能实现更换操作.
如果我看到未PATCH支持的属性/路径请求,我应该返回哪个HTTP代码?如果请求不受支持add或remove操作,我应该返回什么?
我的 OpenShift Api 补丁请求有问题。这是我的实际代码:
public static HttpStatus PatchHTTPRequestCustomHeaders(String url, String data) {
String Bearer = "ayJhbGciOiJSUzI1NiIs...";
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.set("Authorization", "Bearer "+Bearer);
headers.set("X-HTTP-Method-Override", "PATCH");
headers.set("Content-Type", "application/json-patch+json");
headers.set("Accept", "application/json");
final HttpEntity<String> entity = new HttpEntity<String>(data, headers);
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.POST, entity, String.class, 1);
if(response.getStatusCode() == HttpStatus.OK) {
return HttpStatus.OK;
}else {
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
数据包含一个op replace or add or remove ...
PostMan 错误:500 内部服务器错误
春天:
2020-02-14 10:12:28.918 ERROR 14944 --- …Run Code Online (Sandbox Code Playgroud) 我正在使用Symfony2开发REST API。我有一个预订系统,当管理员确认其预订后,我想向客户发送电子邮件。
我有一个预留资源,我们可以使用以下url验证预留:
PATCH本地主机/:id / validate
我想知道使用PATCH方法在验证资源时将电子邮件内容放入请求正文是否正确。
如果没有,正确的方法是什么?
谢谢,Mehdi。
http-patch ×9
http ×5
rest ×5
java ×2
delphi-xe5 ×1
django ×1
dropwizard ×1
http-put ×1
junit ×1
openshift ×1
resttemplate ×1
spring-boot ×1
web ×1