Auto Patch#
Auto Patch#
If a GET
and a PUT
exist for the same resource, but no PATCH
exists at server start up, then a PATCH
operation can be generated for you to make editing more convenient for clients. You can opt-in to this behavior with the autopatch
package:
import "github.com/danielgtaylor/huma/autopatch"
// ...
// Later in the code *after* registering operations...
autopatch.AutoPatch(api)
If the GET
returns an ETag
or Last-Modified
header, then these will be used to make conditional requests on the PUT
operation to prevent distributed write conflicts that might otherwise overwrite someone else's changes.
The following formats are supported out of the box, selected via the Content-Type
header:
- JSON Merge Patch
application/merge-patch+json
- Shorthand Merge Patch
application/merge-patch+shorthand
- JSON Patch
application/json-patch+json
Merge on Steroids
You can think of the Shorthand Merge Patch as an extension to the JSON merge patch with support for field paths, arrays, and a few other features. Patches like this are possible, appending an item to an array (creating it if needed):
If the PATCH
request has no Content-Type
header, or uses application/json
or a variant thereof, then JSON Merge Patch is assumed.
Disabling Auto Patch#
The auto patch feature can be disabled per resource by setting metadata on an operation:
// Register an operation that won't get a PATCH generated.
huma.Register(api, huma.Operation{
OperationID: "get-greeting",
Method: http.MethodGet,
Path: "/greeting/{name}",
Summary: "Get a greeting",
Metadata: map[string]interface{}{
"autopatch": false,
},
}, func(ctx context.Context, input *GreetingInput) (*GreetingOutput, error) {
// ...
})
Dive Deeper#
- Reference
autopatch
package
- External Links