From c5e1af0d5d0c2c043c4729b7b26a80a1bb37d59c Mon Sep 17 00:00:00 2001 From: Paul Lindner Date: Wed, 21 Jan 2026 09:20:20 -0800 Subject: [PATCH 1/2] Add PATCH to HttpMethods enum for service invocation Adds PATCH to the HttpMethods enum to enable using DaprClient.invokeMethod() with PATCH requests through HTTPEndpoints. This is commonly required for partial updates when calling external REST APIs via Dapr service invocation. Fixes #1622 Signed-off-by: Paul Lindner --- sdk/src/main/java/io/dapr/client/DaprHttp.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sdk/src/main/java/io/dapr/client/DaprHttp.java b/sdk/src/main/java/io/dapr/client/DaprHttp.java index 489fd40491..0dc395834c 100644 --- a/sdk/src/main/java/io/dapr/client/DaprHttp.java +++ b/sdk/src/main/java/io/dapr/client/DaprHttp.java @@ -85,7 +85,8 @@ public enum HttpMethods { HEAD, CONNECT, OPTIONS, - TRACE + TRACE, + PATCH } public static class Response { From a2ac14af418df0453671e0bc1004ebf1716639ba Mon Sep 17 00:00:00 2001 From: Paul Lindner Date: Sun, 1 Feb 2026 22:09:30 -0800 Subject: [PATCH 2/2] Add test for PATCH HTTP method Signed-off-by: Paul Lindner --- .../java/io/dapr/client/DaprHttpTest.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/sdk/src/test/java/io/dapr/client/DaprHttpTest.java b/sdk/src/test/java/io/dapr/client/DaprHttpTest.java index ad6753479a..739957ea85 100644 --- a/sdk/src/test/java/io/dapr/client/DaprHttpTest.java +++ b/sdk/src/test/java/io/dapr/client/DaprHttpTest.java @@ -273,6 +273,36 @@ public void invokeDeleteMethod() throws IOException { assertEquals("http://" + sidecarIp + ":3500/v1.0/state", request.uri().toString()); } + @Test + public void invokePatchMethod() throws IOException { + byte[] content = serializer.serialize(EXPECTED_RESULT); + MockHttpResponse mockHttpResponse = new MockHttpResponse(content, HTTP_OK); + CompletableFuture> mockResponse = CompletableFuture.completedFuture(mockHttpResponse); + ArgumentCaptor requestCaptor = ArgumentCaptor.forClass(HttpRequest.class); + + when(httpClient.sendAsync(any(), any())).thenReturn(mockResponse); + + DaprHttp daprHttp = new DaprHttp(sidecarIp, 3500, daprTokenApi, READ_TIMEOUT, httpClient); + Mono mono = daprHttp.invokeApi( + "PATCH", + "v1.0/state".split("/"), + null, + "", + null, + Context.empty() + ); + DaprHttp.Response response = mono.block(); + String body = serializer.deserialize(response.getBody(), String.class); + + verify(httpClient).sendAsync(requestCaptor.capture(), any()); + + HttpRequest request = requestCaptor.getValue(); + + assertEquals(EXPECTED_RESULT, body); + assertEquals("PATCH", request.method()); + assertEquals("http://" + sidecarIp + ":3500/v1.0/state", request.uri().toString()); + } + @Test public void invokeHeadMethod() { MockHttpResponse mockHttpResponse = new MockHttpResponse(HTTP_OK);