{"id":109976,"date":"2021-05-10T07:00:00","date_gmt":"2021-05-10T04:00:00","guid":{"rendered":"https:\/\/www.javacodegeeks.com\/?p=109976"},"modified":"2021-05-05T09:57:09","modified_gmt":"2021-05-05T06:57:09","slug":"supporting-bulk-operations-in-rest-apis","status":"publish","type":"post","link":"https:\/\/www.javacodegeeks.com\/2021\/05\/supporting-bulk-operations-in-rest-apis.html","title":{"rendered":"Supporting bulk operations in REST APIs"},"content":{"rendered":"<p>Bulk (or batch) operations are used to perform an action on more than one resource in single request. This can help reduce networking overhead. For network performance it is usually better to make fewer requests instead of more requests with less data.<\/p>\n<p>However, before adding support for bulk operations you should think twice if this feature is really needed. Often network performance is not what limits request throughput. You should also consider techniques like <a href=\"https:\/\/en.wikipedia.org\/wiki\/HTTP_pipelining\" target=\"_blank\" rel=\"nofollow noopener\">HTTP pipelining<\/a> as alternative to improve performance.<\/p>\n<p>When implementing bulk operations we should differentiate between two different cases:<\/p>\n<ul class=\"wp-block-list\">\n<li>Bulk operations that group together many arbitrary operations in one request. For example: <em>Delete product with id 42<\/em>, <em>create a user named John<\/em> and <em>retrieve all product-reviews created yesterday<\/em>.<\/li>\n<li>Bulk operations that perform one operation on different resources of the same type. For example: <em>Delete the products with id 23, 45, 67 and 89<\/em>.<\/li>\n<\/ul>\n<p>In the next section we will explore different solutions that can help us with both situations. Be aware that the shown solutions might not look very REST-like. Bulk operations in general are not very compatible with REST constraints as we operate on different resources with a single request. So there simply is no real REST solution.<\/p>\n<p>In the following examples we will always return a synchronous response. However, as bulk operations usually take longer to process it is likely you are also interested in an asynchronous processing style. In this case, my post about <a href=\"https:\/\/www.mscharhag.com\/api-design\/rest-asynchronous-operations\" target=\"_blank\" rel=\"noopener\">asynchronous operations with REST<\/a> might also be interesting to you.<\/p>\n<h2 class=\"wp-block-heading\">Expressing multiple operations within the request body<\/h2>\n<p>Probably a way that comes to mind quickly is to use a standard data format like JSON to define a list of desired operations.<\/p>\n<p>Let&#8217;s start with a simple example request:<\/p>\n<div>\n<div id=\"highlighter_234534\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">POST&nbsp;\/batch<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<div>\n<div id=\"highlighter_529414\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<div class=\"line number7 index6 alt2\">7<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">[<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">{<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java string\">\"path\"<\/code><code class=\"java plain\">:&nbsp;<\/code><code class=\"java string\">\"\/products\"<\/code><code class=\"java plain\">,<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java string\">\"method\"<\/code><code class=\"java plain\">:&nbsp;<\/code><code class=\"java string\">\"post\"<\/code><code class=\"java plain\">,<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java string\">\"body\"<\/code><code class=\"java plain\">:&nbsp;{<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java string\">\"name\"<\/code><code class=\"java plain\">:&nbsp;<\/code><code class=\"java string\">\"Cool&nbsp;Gadget\"<\/code><code class=\"java plain\">,<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java string\">\"price\"<\/code><code class=\"java plain\">:&nbsp;\"<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<pre class=\"wp-block-preformatted\">&nbsp;<\/pre>\n<div>\n<div id=\"highlighter_552018\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">nbsp;<\/code><code class=\"java value\">12.45<\/code>&nbsp;<code class=\"java plain\">USD<\/code><code class=\"java string\">\" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;},&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"<\/code><code class=\"java plain\">path<\/code><code class=\"java string\">\":&nbsp;\"<\/code><code class=\"java plain\">\/users\/<\/code><code class=\"java value\">43<\/code><code class=\"java string\">\", &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"<\/code><code class=\"java plain\">method<\/code><code class=\"java string\">\":&nbsp;\"<\/code><code class=\"java plain\">put<\/code><code class=\"java string\">\", &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"<\/code><code class=\"java plain\">body<\/code><code class=\"java string\">\":&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"<\/code><code class=\"java plain\">name<\/code><code class=\"java string\">\":&nbsp;\"<\/code><code class=\"java plain\">Paul\" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}, &nbsp;&nbsp;&nbsp;&nbsp;... ]<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>We use a generic <em>\/batch<\/em> endpoint that accepts a simple JSON format to describe desired operations using URIs and HTTP methods. Here, we want to execute a POST request to <em>\/products<\/em> and a PUT request to <em>\/users\/43<\/em>.<\/p>\n<p>A response body for the shown request might look like this:<\/p>\n<div>\n<div id=\"highlighter_964732\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<div class=\"line number7 index6 alt2\">7<\/div>\n<div class=\"line number8 index7 alt1\">8<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">[<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">{<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java string\">\"path\"<\/code><code class=\"java plain\">:&nbsp;<\/code><code class=\"java string\">\"\/products\"<\/code><code class=\"java plain\">,<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java string\">\"method\"<\/code><code class=\"java plain\">:&nbsp;<\/code><code class=\"java string\">\"post\"<\/code><code class=\"java plain\">,<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java string\">\"body\"<\/code><code class=\"java plain\">:&nbsp;{<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java string\">\"id\"<\/code><code class=\"java plain\">:&nbsp;<\/code><code class=\"java value\">123<\/code><code class=\"java plain\">,<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java string\">\"name\"<\/code><code class=\"java plain\">:&nbsp;<\/code><code class=\"java string\">\"Cool&nbsp;Gadget\"<\/code><code class=\"java plain\">,<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java string\">\"price\"<\/code><code class=\"java plain\">:&nbsp;\"<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<pre class=\"wp-block-preformatted\">&nbsp;<\/pre>\n<div>\n<div id=\"highlighter_595330\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">nbsp;<\/code><code class=\"java value\">12.45<\/code>&nbsp;<code class=\"java plain\">USD<\/code><code class=\"java string\">\" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"<\/code><code class=\"java plain\">status<\/code><code class=\"java string\">\":&nbsp;201 &nbsp;&nbsp;&nbsp;&nbsp;},&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"<\/code><code class=\"java plain\">path<\/code><code class=\"java string\">\":&nbsp;\"<\/code><code class=\"java plain\">\/users\/<\/code><code class=\"java value\">43<\/code><code class=\"java string\">\", &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"<\/code><code class=\"java plain\">method<\/code><code class=\"java string\">\":&nbsp;\"<\/code><code class=\"java plain\">put<\/code><code class=\"java string\">\", &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"<\/code><code class=\"java plain\">body<\/code><code class=\"java string\">\":&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"<\/code><code class=\"java plain\">id<\/code><code class=\"java string\">\":&nbsp;43, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"<\/code><code class=\"java plain\">name<\/code><code class=\"java string\">\":&nbsp;\"<\/code><code class=\"java plain\">Paul<\/code><code class=\"java string\">\" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"<\/code><code class=\"java plain\">status\":&nbsp;<\/code><code class=\"java value\">200<\/code> &nbsp;&nbsp;&nbsp;&nbsp;<code class=\"java plain\">}, &nbsp;&nbsp;&nbsp;&nbsp;... ]<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>For each requested operation we get a result object containing the URI and HTTP method again. Additionally we get the status code and response body for each operation.<\/p>\n<p>This does not look too bad. In fact, APIs like this can be found in practice. Facebook for example uses a similiar approach to <a href=\"https:\/\/developers.facebook.com\/docs\/graph-api\/making-multiple-requests\" target=\"_blank\" rel=\"nofollow noopener\">batch multiple Graph API requests<\/a>.<\/p>\n<p>However, there are some things to consider with this approach:<\/p>\n<p>How are the desired operations executed on the server side? Maybe it is implemented as simple method call. It is also possible to create a real HTTP requests from the JSON data and then process those requests. In this case, it is important to think about request headers which might contain important information required by the processing endpoint (e.g. authentication tokens, etc.).<\/p>\n<p>Headers in general are missing in this example. However, headers might be important. For example, it is perfectly viable for a server to respond to a POST request with HTTP 201 and an empty body (see my post about <a href=\"https:\/\/www.mscharhag.com\/api-design\/resource-creation-post\" target=\"_blank\" rel=\"noopener\">resource creation<\/a>). The URI of the newly created resource is usually transported using a <em>Location<\/em> header. Without access to this header the client might not know how to look up the newly created resource. So think about adding support for headers in your request format.<\/p>\n<p>In the example we assume that all requests and responses use JSON data as body which might not always be the case (think of file uploads for example). As alternative we can define the request body as string which gives us more flexibility. In this case, we need to escape JSON double quotes which can be awkward to read:<\/p>\n<p>An example request that includes headers and uses a string body might look like this:<\/p>\n<div>\n<div id=\"highlighter_146678\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">01<\/div>\n<div class=\"line number2 index1 alt1\">02<\/div>\n<div class=\"line number3 index2 alt2\">03<\/div>\n<div class=\"line number4 index3 alt1\">04<\/div>\n<div class=\"line number5 index4 alt2\">05<\/div>\n<div class=\"line number6 index5 alt1\">06<\/div>\n<div class=\"line number7 index6 alt2\">07<\/div>\n<div class=\"line number8 index7 alt1\">08<\/div>\n<div class=\"line number9 index8 alt2\">09<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<div class=\"line number12 index11 alt1\">12<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">[<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">{<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java string\">\"path\"<\/code><code class=\"java plain\">:&nbsp;<\/code><code class=\"java string\">\"\/users\/43\"<\/code><code class=\"java plain\">,<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java string\">\"method\"<\/code><code class=\"java plain\">:&nbsp;<\/code><code class=\"java string\">\"put\"<\/code><code class=\"java plain\">,<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java string\">\"headers\"<\/code><code class=\"java plain\">:&nbsp;[{&nbsp;<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java string\">\"name\"<\/code><code class=\"java plain\">:&nbsp;<\/code><code class=\"java string\">\"Content-Type\"<\/code><code class=\"java plain\">,&nbsp;<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java string\">\"value\"<\/code><code class=\"java plain\">:&nbsp;<\/code><code class=\"java string\">\"application\/json\"<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}],<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java string\">\"body\"<\/code><code class=\"java plain\">:&nbsp;<\/code><code class=\"java string\">\"{&nbsp;\\\"name\\\":&nbsp;\\\"Paul\\\"&nbsp;}\"<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">},<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">...<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"java plain\">]<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h2 class=\"wp-block-heading\">Multipart Content-Type for the rescue?<\/h2>\n<p>In the previous section we essentially translated HTTP requests and responses to JSON so we can group them together in a single request. However, we can do the same in a more standardized way with multipart content-types.<\/p>\n<p>A multipart <em>Content-Type<\/em> header indicates that the HTTP message body consists of multiple distinct body parts and each part can have its own <em>Content-Type<\/em>. We can use this to merge multiple HTTP requests into a single multipart request body.<\/p>\n<p>A quick note before we look at an example: My example snippets for HTTP requests and responses are usually simplified (unnecessary headers, HTTP versions, etc. might be skipped). However, in the next snippet we pack HTTP requests into the body of a multipart request requiring correct HTTP syntax. Therefore, the next snippets use the exact HTTP message syntax.<\/p>\n<p>Now let&#8217;s look at an example multipart request containing two HTTP requests:<\/p>\n<div>\n<div id=\"highlighter_327910\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">01<\/div>\n<div class=\"line number2 index1 alt1\">02<\/div>\n<div class=\"line number3 index2 alt2\">03<\/div>\n<div class=\"line number4 index3 alt1\">04<\/div>\n<div class=\"line number5 index4 alt2\">05<\/div>\n<div class=\"line number6 index5 alt1\">06<\/div>\n<div class=\"line number7 index6 alt2\">07<\/div>\n<div class=\"line number8 index7 alt1\">08<\/div>\n<div class=\"line number9 index8 alt2\">09<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<div class=\"line number12 index11 alt1\">12<\/div>\n<div class=\"line number13 index12 alt2\">13<\/div>\n<div class=\"line number14 index13 alt1\">14<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java value\">1<\/code>&nbsp; <code class=\"java plain\">POST&nbsp;http:<\/code><code class=\"java comments\">\/\/api.my-cool-service.com\/batch&nbsp;HTTP\/1.1<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java spaces\">&nbsp;<\/code><code class=\"java value\">2<\/code>&nbsp; <code class=\"java plain\">Content-Type:&nbsp;multipart\/mixed;&nbsp;boundary=request_delimiter<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;<\/code><code class=\"java value\">3<\/code>&nbsp; <code class=\"java plain\">Content-Length:&nbsp;&lt;total&nbsp;body&nbsp;length&nbsp;in&nbsp;bytes&gt;<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;<\/code><code class=\"java value\">4<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java spaces\">&nbsp;<\/code><code class=\"java value\">5<\/code>&nbsp; <code class=\"java plain\">--request_delimiter<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java spaces\">&nbsp;<\/code><code class=\"java value\">6<\/code>&nbsp; <code class=\"java plain\">Content-Type:&nbsp;application\/http<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java spaces\">&nbsp;<\/code><code class=\"java value\">7<\/code>&nbsp; <code class=\"java plain\">Content-ID:&nbsp;fa32d92f-87d9-<\/code><code class=\"java value\">4097<\/code><code class=\"java plain\">-9aa3-e4aa7527c8a7<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java spaces\">&nbsp;<\/code><code class=\"java value\">8<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"java spaces\">&nbsp;<\/code><code class=\"java value\">9<\/code>&nbsp; <code class=\"java plain\">POST&nbsp;http:<\/code><code class=\"java comments\">\/\/api.my-cool-service.com\/products&nbsp;HTTP\/1.1<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"java value\">10<\/code>&nbsp; <code class=\"java plain\">Content-Type:&nbsp;application\/json<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"java value\">11<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"java value\">12<\/code>&nbsp; <code class=\"java plain\">{<\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"java value\">13<\/code>&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;<code class=\"java string\">\"name\"<\/code><code class=\"java plain\">:&nbsp;<\/code><code class=\"java string\">\"Cool&nbsp;Gadget\"<\/code><code class=\"java plain\">,<\/code><\/div>\n<div class=\"line number14 index13 alt1\"><code class=\"java value\">14<\/code>&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;<code class=\"java string\">\"price\"<\/code><code class=\"java plain\">:&nbsp;\"<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<pre class=\"wp-block-preformatted\">&nbsp;<\/pre>\n<div>\n<div id=\"highlighter_410758\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">nbsp;<\/code><code class=\"java value\">12.45<\/code>&nbsp;<code class=\"java plain\">USD<\/code><code class=\"java string\">\" 15 } 16 --request_delimiter 17 Content-Type:&nbsp;application\/http 18 Content-ID:&nbsp;a0e98ffb-0b62-42a1-a321-54c6e9ef4c99 19 20 PUT&nbsp;<a href=\"http:\/\/api.my-cool-service.com\/users\/43&nbsp;HTTP\/1.1\">http:\/\/api.my-cool-service.com\/users\/43&nbsp;HTTP\/1.1<\/a> 21 Content-Type:&nbsp;application\/json 22 23 { 24 &nbsp;&nbsp;\"<\/code><code class=\"java plain\">section<\/code><code class=\"java string\">\":&nbsp;\"<\/code><code class=\"java plain\">Section&nbsp;<\/code><code class=\"java value\">2<\/code><code class=\"java plain\">\" <\/code><code class=\"java value\">25<\/code> <code class=\"java plain\">} <\/code><code class=\"java value\">26<\/code> <code class=\"java plain\">--request_delimiter--<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Multipart content types require a <em>boundary <\/em>parameter. This parameter specifies the so-called <em>encapsulation boundary<\/em> which acts like a delimiter between different body parts.<div style=\"display:inline-block; margin: 15px 0;\"> <div id=\"adngin-JavaCodeGeeks_incontent_video-0\" style=\"display:inline-block;\"><\/div> <\/div><\/p>\n<p>Quoting the <a href=\"https:\/\/www.w3.org\/Protocols\/rfc1341\/7_2_Multipart.html\" target=\"_blank\" rel=\"noopener\">RFC<\/a>:<\/p>\n<p>The encapsulation boundary is defined as a line consisting entirely of two hyphen characters (&#8220;-&#8220;, decimal code 45) followed by the boundary parameter value from the Content-Type header field.<\/p>\n<p>In line 2 we set the <em>Content-Type<\/em> to <em>multipart\/mixed<\/em> with a <em>boundary <\/em>parameter of <em>request_delimiter<\/em>. The blank line after the <em>Content-Length<\/em> header separates HTTP headers from the body. The following lines define the multipart request body.<\/p>\n<p>We start with the <em>encapsulation boundary<\/em> indicating the beginning of the first body part. Next follow the body part headers. Here, we set the <em>Content-Type<\/em> header of the body part to <em>application\/http<\/em> which indicates that this body part contains a HTTP message. We also set a <em>Content-Id<\/em> header which we can be used to identify a specific body part. We use a client generated UUID for this.<\/p>\n<p>The next blank line (line 8) indicates that now the actual body part begins (in our case that&#8217;s the embedded HTTP request). The first body part ends with the <em>encapsulation boundary<\/em> at line 16.<\/p>\n<p>After the encapsulation boundary, follows the next body part which uses the same format as the first one.<\/p>\n<p>Note that the <em>encapsulation boundary<\/em> following the last body part contains two additional hyphens at the end which indicates that no further body parts will follow.<\/p>\n<p>A response to this request might follow the same principle and look like this:<\/p>\n<div>\n<div id=\"highlighter_337278\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">01<\/div>\n<div class=\"line number2 index1 alt1\">02<\/div>\n<div class=\"line number3 index2 alt2\">03<\/div>\n<div class=\"line number4 index3 alt1\">04<\/div>\n<div class=\"line number5 index4 alt2\">05<\/div>\n<div class=\"line number6 index5 alt1\">06<\/div>\n<div class=\"line number7 index6 alt2\">07<\/div>\n<div class=\"line number8 index7 alt1\">08<\/div>\n<div class=\"line number9 index8 alt2\">09<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<div class=\"line number12 index11 alt1\">12<\/div>\n<div class=\"line number13 index12 alt2\">13<\/div>\n<div class=\"line number14 index13 alt1\">14<\/div>\n<div class=\"line number15 index14 alt2\">15<\/div>\n<div class=\"line number16 index15 alt1\">16<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java value\">1<\/code>&nbsp; <code class=\"java plain\">HTTP\/<\/code><code class=\"java value\">1.1<\/code>&nbsp;<code class=\"java value\">200<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java spaces\">&nbsp;<\/code><code class=\"java value\">2<\/code>&nbsp; <code class=\"java plain\">Content-Type:&nbsp;multipart\/mixed;&nbsp;boundary=response_delimiter<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;<\/code><code class=\"java value\">3<\/code>&nbsp; <code class=\"java plain\">Content-Length:&nbsp;&lt;total&nbsp;body&nbsp;length&nbsp;in&nbsp;bytes&gt;<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;<\/code><code class=\"java value\">4<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java spaces\">&nbsp;<\/code><code class=\"java value\">5<\/code>&nbsp; <code class=\"java plain\">--response_delimiter<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java spaces\">&nbsp;<\/code><code class=\"java value\">6<\/code>&nbsp; <code class=\"java plain\">Content-Type:&nbsp;application\/http<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java spaces\">&nbsp;<\/code><code class=\"java value\">7<\/code>&nbsp; <code class=\"java plain\">Content-ID:&nbsp;fa32d92f-87d9-<\/code><code class=\"java value\">4097<\/code><code class=\"java plain\">-9aa3-e4aa7527c8a7<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java spaces\">&nbsp;<\/code><code class=\"java value\">8<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"java spaces\">&nbsp;<\/code><code class=\"java value\">9<\/code>&nbsp; <code class=\"java plain\">HTTP\/<\/code><code class=\"java value\">1.1<\/code>&nbsp;<code class=\"java value\">201<\/code>&nbsp;<code class=\"java plain\">Created<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"java value\">10<\/code>&nbsp; <code class=\"java plain\">Content-Type:&nbsp;application\/json<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"java value\">11<\/code>&nbsp; <code class=\"java plain\">Location:&nbsp;http:<\/code><code class=\"java comments\">\/\/api.my-cool-service.com\/products\/123<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"java value\">12<\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"java value\">13<\/code>&nbsp; <code class=\"java plain\">{<\/code><\/div>\n<div class=\"line number14 index13 alt1\"><code class=\"java value\">14<\/code>&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;<code class=\"java string\">\"id\"<\/code><code class=\"java plain\">:&nbsp;<\/code><code class=\"java value\">123<\/code><code class=\"java plain\">,<\/code><\/div>\n<div class=\"line number15 index14 alt2\"><code class=\"java value\">15<\/code>&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;<code class=\"java string\">\"name\"<\/code><code class=\"java plain\">:&nbsp;<\/code><code class=\"java string\">\"Cool&nbsp;Gadget\"<\/code><code class=\"java plain\">,<\/code><\/div>\n<div class=\"line number16 index15 alt1\"><code class=\"java value\">16<\/code>&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;<code class=\"java string\">\"price\"<\/code><code class=\"java plain\">:&nbsp;\"<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<pre class=\"wp-block-preformatted\">&nbsp;<\/pre>\n<div>\n<div id=\"highlighter_198556\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">nbsp;<\/code><code class=\"java value\">12.45<\/code>&nbsp;<code class=\"java plain\">USD<\/code><code class=\"java string\">\" 17 } 18 --response_delimiter 19 Content-Type:&nbsp;application\/http 20 Content-ID:&nbsp;a0e98ffb-0b62-42a1-a321-54c6e9ef4c99 21 22 HTTP\/1.1&nbsp;200&nbsp;OK 23 Content-Type:&nbsp;application\/json 24 25 { 26 &nbsp;&nbsp;&nbsp;&nbsp;\"<\/code><code class=\"java plain\">id<\/code><code class=\"java string\">\":&nbsp;43, 27 &nbsp;&nbsp;&nbsp;&nbsp;\"<\/code><code class=\"java plain\">name<\/code><code class=\"java string\">\":&nbsp;\"<\/code><code class=\"java plain\">Paul\" <\/code><code class=\"java value\">28<\/code> <code class=\"java plain\">} <\/code><code class=\"java value\">29<\/code> <code class=\"java plain\">--response_delimiter--<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>This multipart response body contains two body parts both containing HTTP responses. Note that the first body part also contains a <em>Location <\/em>header which should be included when sending a HTTP 201 (Created) response status.<\/p>\n<p>Multipart messages seem like a nice way to merge multiple HTTP messages into a single message as it uses a standardized and generally understood technique.<\/p>\n<p>However, there is one big caveat here. Clients and the server need to be able to construct and process the actual HTTP messages in raw text format. Usually this functionality is hidden behind HTTP client libraries and server side frameworks and might not be easily accessible.<\/p>\n<h2 class=\"wp-block-heading\">Bulk operations on REST resources<\/h2>\n<p>In the previous examples we used a generic <em>\/batch<\/em> endpoint that can be used to modify many different types of resources in a single request. Now we will apply bulk operations on a specific set of resources to move a bit into a more <em>rest-like<\/em> style.<\/p>\n<p>Sometimes only a single operation needs to support bulk data. In such a case, we can simply create a new resource that accepts a collection of bulk entries.<\/p>\n<p>For example, assume we want to import a couple of products with a single request:<\/p>\n<div>\n<div id=\"highlighter_650768\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">POST&nbsp;\/product-<\/code><code class=\"java keyword\">import<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<div>\n<div id=\"highlighter_332465\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">[<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">{<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java string\">\"name\"<\/code><code class=\"java plain\">:&nbsp;<\/code><code class=\"java string\">\"Cool&nbsp;Gadget\"<\/code><code class=\"java plain\">,<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java string\">\"price\"<\/code><code class=\"java plain\">:&nbsp;\"<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<pre class=\"wp-block-preformatted\">&nbsp;<\/pre>\n<div>\n<div id=\"highlighter_373994\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">nbsp;<\/code><code class=\"java value\">12.45<\/code>&nbsp;<code class=\"java plain\">USD<\/code><code class=\"java string\">\" &nbsp;&nbsp;&nbsp;&nbsp;}, &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"<\/code><code class=\"java plain\">name<\/code><code class=\"java string\">\":&nbsp;\"<\/code><code class=\"java plain\">Very&nbsp;cool&nbsp;Gadget<\/code><code class=\"java string\">\", &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"<\/code><code class=\"java plain\">price<\/code><code class=\"java string\">\":&nbsp;\"<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<pre class=\"wp-block-preformatted\">&nbsp;<\/pre>\n<div>\n<div id=\"highlighter_360816\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">nbsp;<\/code><code class=\"java value\">19.99<\/code>&nbsp;<code class=\"java plain\">USD\" &nbsp;&nbsp;&nbsp;&nbsp;}, &nbsp;&nbsp;&nbsp;&nbsp;... ]<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>A simple response body might look like this:<\/p>\n<div>\n<div id=\"highlighter_661435\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">01<\/div>\n<div class=\"line number2 index1 alt1\">02<\/div>\n<div class=\"line number3 index2 alt2\">03<\/div>\n<div class=\"line number4 index3 alt1\">04<\/div>\n<div class=\"line number5 index4 alt2\">05<\/div>\n<div class=\"line number6 index5 alt1\">06<\/div>\n<div class=\"line number7 index6 alt2\">07<\/div>\n<div class=\"line number8 index7 alt1\">08<\/div>\n<div class=\"line number9 index8 alt2\">09<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<div class=\"line number12 index11 alt1\">12<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">[<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">{<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java string\">\"status\"<\/code><code class=\"java plain\">:&nbsp;<\/code><code class=\"java string\">\"imported\"<\/code><code class=\"java plain\">,<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java string\">\"id\"<\/code><code class=\"java plain\">:&nbsp;<\/code><code class=\"java value\">234235<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code>&nbsp;<\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">},<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">{<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java string\">\"status\"<\/code><code class=\"java plain\">:&nbsp;<\/code><code class=\"java string\">\"failed\"<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java string\">\"error\"<\/code><code class=\"java plain\">:&nbsp;<\/code><code class=\"java string\">\"Product&nbsp;name&nbsp;too&nbsp;long,&nbsp;max&nbsp;15&nbsp;characters&nbsp;allowed\"<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">},<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">...<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"java plain\">]<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Again we return a collection containing details about every entry. As we provide a response to a specific operation (<em>importing products<\/em>) there is not need to use a generic response format. Instead, we can use a specific format that communicates the import status and potential import errors.<\/p>\n<h2 class=\"wp-block-heading\">Partially updating collections<\/h2>\n<p>In a <a href=\"https:\/\/www.mscharhag.com\/api-design\/rest-partial-updates-patch\" target=\"_blank\" rel=\"noopener\">previous post<\/a> we learned that PATCH can be used for partial modification of resources. PATCH can also use a separate format to describe the desired changes.<\/p>\n<p>Both sound useful for implementing bulk operations. By using PATCH on a resource collection (e.g. <em>\/products<\/em>) we can <em>partially modify the collection<\/em>. We can use this to add new elements to the collection or update existing elements.<\/p>\n<p>For example we can use the following snippet to modify the <em>\/products<\/em> collection:<\/p>\n<div>\n<div id=\"highlighter_959786\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">PATCH&nbsp;\/products<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<div>\n<div id=\"highlighter_253662\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">01<\/div>\n<div class=\"line number2 index1 alt1\">02<\/div>\n<div class=\"line number3 index2 alt2\">03<\/div>\n<div class=\"line number4 index3 alt1\">04<\/div>\n<div class=\"line number5 index4 alt2\">05<\/div>\n<div class=\"line number6 index5 alt1\">06<\/div>\n<div class=\"line number7 index6 alt2\">07<\/div>\n<div class=\"line number8 index7 alt1\">08<\/div>\n<div class=\"line number9 index8 alt2\">09<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<div class=\"line number12 index11 alt1\">12<\/div>\n<div class=\"line number13 index12 alt2\">13<\/div>\n<div class=\"line number14 index13 alt1\">14<\/div>\n<div class=\"line number15 index14 alt2\">15<\/div>\n<div class=\"line number16 index15 alt1\">16<\/div>\n<div class=\"line number17 index16 alt2\">17<\/div>\n<div class=\"line number18 index17 alt1\">18<\/div>\n<div class=\"line number19 index18 alt2\">19<\/div>\n<div class=\"line number20 index19 alt1\">20<\/div>\n<div class=\"line number21 index20 alt2\">21<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">[<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">{<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java string\">\"action\"<\/code><code class=\"java plain\">:&nbsp;<\/code><code class=\"java string\">\"replace\"<\/code><code class=\"java plain\">,<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java string\">\"path\"<\/code><code class=\"java plain\">:&nbsp;<\/code><code class=\"java string\">\"\/123\"<\/code><code class=\"java plain\">,<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java string\">\"value\"<\/code><code class=\"java plain\">:&nbsp;{<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java string\">\"name\"<\/code><code class=\"java plain\">:&nbsp;<\/code><code class=\"java string\">\"Yellow&nbsp;cap\"<\/code><code class=\"java plain\">,<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java string\">\"description\"<\/code><code class=\"java plain\">:&nbsp;<\/code><code class=\"java string\">\"It's&nbsp;a&nbsp;cap&nbsp;and&nbsp;it's&nbsp;yellow\"<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">},<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">{<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java string\">\"action\"<\/code><code class=\"java plain\">:&nbsp;<\/code><code class=\"java string\">\"delete\"<\/code><code class=\"java plain\">,<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java string\">\"path\"<\/code><code class=\"java plain\">:&nbsp;<\/code><code class=\"java string\">\"\/124\"<\/code><code class=\"java plain\">,<\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">},<\/code><\/div>\n<div class=\"line number14 index13 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">{<\/code><\/div>\n<div class=\"line number15 index14 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java string\">\"action\"<\/code><code class=\"java plain\">:&nbsp;<\/code><code class=\"java string\">\"create\"<\/code><code class=\"java plain\">,<\/code><\/div>\n<div class=\"line number16 index15 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java string\">\"value\"<\/code><code class=\"java plain\">:&nbsp;{<\/code><\/div>\n<div class=\"line number17 index16 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java string\">\"name\"<\/code><code class=\"java plain\">:&nbsp;<\/code><code class=\"java string\">\"Cool&nbsp;new&nbsp;product\"<\/code><code class=\"java plain\">,<\/code><\/div>\n<div class=\"line number18 index17 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java string\">\"description\"<\/code><code class=\"java plain\">:&nbsp;<\/code><code class=\"java string\">\"It&nbsp;is&nbsp;very&nbsp;cool!\"<\/code><\/div>\n<div class=\"line number19 index18 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number20 index19 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number21 index20 alt2\"><code class=\"java plain\">]<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Here we perform three operations on the <em>\/products<\/em> collection in a single request. We update resource <em>\/products\/123<\/em> with new information, delete resource <em>\/products\/123<\/em> and create a completely new product.<\/p>\n<p>A response might look somehow like this:<\/p>\n<div>\n<div id=\"highlighter_787591\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">01<\/div>\n<div class=\"line number2 index1 alt1\">02<\/div>\n<div class=\"line number3 index2 alt2\">03<\/div>\n<div class=\"line number4 index3 alt1\">04<\/div>\n<div class=\"line number5 index4 alt2\">05<\/div>\n<div class=\"line number6 index5 alt1\">06<\/div>\n<div class=\"line number7 index6 alt2\">07<\/div>\n<div class=\"line number8 index7 alt1\">08<\/div>\n<div class=\"line number9 index8 alt2\">09<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<div class=\"line number12 index11 alt1\">12<\/div>\n<div class=\"line number13 index12 alt2\">13<\/div>\n<div class=\"line number14 index13 alt1\">14<\/div>\n<div class=\"line number15 index14 alt2\">15<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">[<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">{<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java string\">\"action\"<\/code><code class=\"java plain\">:&nbsp;<\/code><code class=\"java string\">\"replace\"<\/code><code class=\"java plain\">,<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java string\">\"path\"<\/code><code class=\"java plain\">:&nbsp;<\/code><code class=\"java string\">\"\/123\"<\/code><code class=\"java plain\">,<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java string\">\"status\"<\/code><code class=\"java plain\">:&nbsp;<\/code><code class=\"java string\">\"success\"<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">},&nbsp;<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">{<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java string\">\"action\"<\/code><code class=\"java plain\">:&nbsp;<\/code><code class=\"java string\">\"delete\"<\/code><code class=\"java plain\">,<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java string\">\"path\"<\/code><code class=\"java plain\">:&nbsp;<\/code><code class=\"java string\">\"\/124\"<\/code><code class=\"java plain\">,<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java string\">\"status\"<\/code><code class=\"java plain\">:&nbsp;<\/code><code class=\"java string\">\"success\"<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">},&nbsp;{<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java string\">\"action\"<\/code><code class=\"java plain\">:&nbsp;<\/code><code class=\"java string\">\"create\"<\/code><code class=\"java plain\">,<\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java string\">\"status\"<\/code><code class=\"java plain\">:&nbsp;<\/code><code class=\"java string\">\"success\"<\/code><\/div>\n<div class=\"line number14 index13 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number15 index14 alt2\"><code class=\"java plain\">]<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Here we need to use a generic response entry format again as it needs to be compatible to all possible request actions.<\/p>\n<p>However, it would be too easy without a huge caveat: PATCH requires changes to be applied atomically.<\/p>\n<p>The <a href=\"https:\/\/tools.ietf.org\/html\/rfc5789\" target=\"_blank\" rel=\"noopener\">RFC<\/a> says:<\/p>\n<p>The server MUST apply the entire set of changes atomically and never provide [..] a partially modified representation. If the entire patch document cannot be successfully applied, then the server MUST NOT apply any of the changes.<\/p>\n<p>I usually would not recommend to implement bulk operation in an atomic way as this can increase complexity a lot.<\/p>\n<p>A simple workaround to be compatible with the HTTP specifications is to create a separate sub-resource and use POST instead of PATCH.<\/p>\n<p>For example:<\/p>\n<div>\n<div id=\"highlighter_680218\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">POST&nbsp;\/products\/batch&nbsp;<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>(same request body as the previous PATCH request)<\/p>\n<p>If you really want to go the atomic way, you might need to think about the response format again. In this case, it is not possible that some requested changes are applied while others are not. Instead you need to communicate what requested changes failed and which could have been applied if everything else would have worked.<\/p>\n<p>In this case, a response might look like this:<\/p>\n<div>\n<div id=\"highlighter_986599\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">01<\/div>\n<div class=\"line number2 index1 alt1\">02<\/div>\n<div class=\"line number3 index2 alt2\">03<\/div>\n<div class=\"line number4 index3 alt1\">04<\/div>\n<div class=\"line number5 index4 alt2\">05<\/div>\n<div class=\"line number6 index5 alt1\">06<\/div>\n<div class=\"line number7 index6 alt2\">07<\/div>\n<div class=\"line number8 index7 alt1\">08<\/div>\n<div class=\"line number9 index8 alt2\">09<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<div class=\"line number12 index11 alt1\">12<\/div>\n<div class=\"line number13 index12 alt2\">13<\/div>\n<div class=\"line number14 index13 alt1\">14<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">[<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">{<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java string\">\"action\"<\/code><code class=\"java plain\">:&nbsp;<\/code><code class=\"java string\">\"replace\"<\/code><code class=\"java plain\">,<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java string\">\"path\"<\/code><code class=\"java plain\">:&nbsp;<\/code><code class=\"java string\">\"\/123\"<\/code><code class=\"java plain\">,<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java string\">\"status\"<\/code><code class=\"java plain\">:&nbsp;<\/code><code class=\"java string\">\"rolled&nbsp;back\"<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">},&nbsp;<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">{<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java string\">\"action\"<\/code><code class=\"java plain\">:&nbsp;<\/code><code class=\"java string\">\"delete\"<\/code><code class=\"java plain\">,<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java string\">\"path\"<\/code><code class=\"java plain\">:&nbsp;<\/code><code class=\"java string\">\"\/124\"<\/code><code class=\"java plain\">,<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java string\">\"status\"<\/code><code class=\"java plain\">:&nbsp;<\/code><code class=\"java string\">\"failed\"<\/code><code class=\"java plain\">,<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java string\">\"error\"<\/code><code class=\"java plain\">:&nbsp;<\/code><code class=\"java string\">\"resource&nbsp;not&nbsp;found\"<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">},<\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">..<\/code><\/div>\n<div class=\"line number14 index13 alt1\"><code class=\"java plain\">]<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h2 class=\"wp-block-heading\">Which HTTP status code is appropriate for responses to bulk requests?<\/h2>\n<p>With bulk requests we have the problem than some parts of the request might execute successfully while other fail. If everything worked it is easy, in this case we can simply return HTTP 200 OK.<\/p>\n<p>Even if all requested changes fail it can be argued that HTTP 200 is still a valid response code as long as the bulk operation itself completed successfully.<\/p>\n<p>In either way the client needs to process the response body to get detailed information about the processing status.<\/p>\n<p>Another idea that might come in mind is HTTP 207 (Multi-status). HTTP 207 is part of <a href=\"https:\/\/tools.ietf.org\/html\/rfc4918\" target=\"_blank\" rel=\"noopener\">RFC 4918<\/a> (HTTP extensions for WebDAV) and described like this:<\/p>\n<p>A Multi-Status response conveys information about multiple resources in situations where multiple status codes might be appropriate. [..] Although &#8216;207&#8217; is used as the overall response status code, the recipient needs to consult the contents of the multistatus response body for further information about the success or failure of the method execution. The response MAY be used in success, partial success and also in failure situations.<\/p>\n<p>So far this reads like a great fit.<\/p>\n<p>Unfortunately HTTP 207 is part of the Webdav specification and requires a specific response body format that looks like this:<\/p>\n<div>\n<div id=\"highlighter_309276\" class=\"syntaxhighlighter  xml\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<div class=\"line number7 index6 alt2\">7<\/div>\n<div class=\"line number8 index7 alt1\">8<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"xml plain\">&lt;?<\/code><code class=\"xml keyword\">xml<\/code>&nbsp;<code class=\"xml color1\">version<\/code><code class=\"xml plain\">=<\/code><code class=\"xml string\">\"1.0\"<\/code>&nbsp;<code class=\"xml color1\">encoding<\/code><code class=\"xml plain\">=<\/code><code class=\"xml string\">\"utf-8\"<\/code>&nbsp;<code class=\"xml plain\">?&gt;<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"xml plain\">&lt;<\/code><code class=\"xml keyword\">d:multistatus<\/code>&nbsp;<code class=\"xml color1\">xmlns:d<\/code><code class=\"xml plain\">=<\/code><code class=\"xml string\">\"DAV:\"<\/code><code class=\"xml plain\">&gt;<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"xml spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"xml plain\">&lt;<\/code><code class=\"xml keyword\">d:response<\/code><code class=\"xml plain\">&gt;<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"xml spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"xml plain\">&lt;<\/code><code class=\"xml keyword\">d:href<\/code><code class=\"xml plain\">&gt;<a href=\"http:\/\/www.example.com\/container\/resource3\">http:\/\/www.example.com\/container\/resource3<\/a>&lt;\/<\/code><code class=\"xml keyword\">d:href<\/code><code class=\"xml plain\">&gt;<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"xml spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"xml plain\">&lt;<\/code><code class=\"xml keyword\">d:status<\/code><code class=\"xml plain\">&gt;HTTP\/1.1&nbsp;423&nbsp;Locked&lt;\/<\/code><code class=\"xml keyword\">d:status<\/code><code class=\"xml plain\">&gt;<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"xml spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"xml plain\">&lt;<\/code><code class=\"xml keyword\">d:error<\/code><code class=\"xml plain\">&gt;&lt;<\/code><code class=\"xml keyword\">d:lock-token-submitted<\/code><code class=\"xml plain\">\/&gt;&lt;\/<\/code><code class=\"xml keyword\">d:error<\/code><code class=\"xml plain\">&gt;<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"xml spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"xml plain\">&lt;\/<\/code><code class=\"xml keyword\">d:response<\/code><code class=\"xml plain\">&gt;<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"xml plain\">&lt;\/<\/code><code class=\"xml keyword\">d:multistatus<\/code><code class=\"xml plain\">&gt;<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>This is likely not the response format you want. Some might argue that it is fine to reuse HTTP 207 with a custom response format. Personally I would not recommend doing this and instead use a simple HTTP 200 status code.<\/p>\n<p>In case you the bulk request is processed asynchronously HTTP 202 (Accepted) is the status code to use.<\/p>\n<h2 class=\"wp-block-heading\">Summary<\/h2>\n<p>We looked at different approaches of building bulk APIs. All approaches have different up- and downsides. There is no single correct way as it always depends on your requirements.<\/p>\n<p>If you need a generic way to submit multiple actions in a single request you can use a custom JSON format. Alternatively you can use a multipart content-type to merge multiple requests into a single request.<\/p>\n<p>You can also come up with separate resources that that express the desired operation. This is usually the simplest and most pragmatic way if you only have one or a few operations that need to support bulk operations.<\/p>\n<p>In all scenarios you should evaluate if bulk operations really produce the desired performance gains. Otherwise, the additional complexity of bulk operations is usually not worth the effort.<\/p>\n<div class=\"attribution\">\n<table>\n<tbody>\n<tr>\n<td>\n<p>Published on Java Code Geeks with permission by Michael Scharhag, partner at our <a href=\"\/\/www.javacodegeeks.com\/join-us\/jcg\/\" target=\"_blank\" rel=\"noopener\">JCG program<\/a>. See the original article here: <a href=\"https:\/\/www.mscharhag.com\/api-design\/bulk-and-batch-operations\" target=\"_blank\" rel=\"noopener\">Supporting bulk operations in REST APIs<\/a><\/p>\n<p>Opinions expressed by Java Code Geeks contributors are their own.<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Bulk (or batch) operations are used to perform an action on more than one resource in single request. This can help reduce networking overhead. For network performance it is usually better to make fewer requests instead of more requests with less data. However, before adding support for bulk operations you should think twice if this &hellip;<\/p>\n","protected":false},"author":514,"featured_media":112,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[815],"class_list":["post-109976","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-enterprise-java","tag-rest"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Supporting bulk operations in REST APIs - Java Code Geeks<\/title>\n<meta name=\"description\" content=\"Interested to learn about bulk operations? Check our article explaining how to Support bulk operations in REST APIs.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.javacodegeeks.com\/2021\/05\/supporting-bulk-operations-in-rest-apis.html\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Supporting bulk operations in REST APIs - Java Code Geeks\" \/>\n<meta property=\"og:description\" content=\"Interested to learn about bulk operations? Check our article explaining how to Support bulk operations in REST APIs.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.javacodegeeks.com\/2021\/05\/supporting-bulk-operations-in-rest-apis.html\" \/>\n<meta property=\"og:site_name\" content=\"Java Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/javacodegeeks\" \/>\n<meta property=\"article:published_time\" content=\"2021-05-10T04:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Michael Scharhag\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@https:\/\/twitter.com\/mscharhag\" \/>\n<meta name=\"twitter:site\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Michael Scharhag\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"13 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2021\\\/05\\\/supporting-bulk-operations-in-rest-apis.html#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2021\\\/05\\\/supporting-bulk-operations-in-rest-apis.html\"},\"author\":{\"name\":\"Michael Scharhag\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/0f0f81e875d40e3f820392e0ffce65d1\"},\"headline\":\"Supporting bulk operations in REST APIs\",\"datePublished\":\"2021-05-10T04:00:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2021\\\/05\\\/supporting-bulk-operations-in-rest-apis.html\"},\"wordCount\":2086,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2021\\\/05\\\/supporting-bulk-operations-in-rest-apis.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/enterprise-java-logo.jpg\",\"keywords\":[\"REST\"],\"articleSection\":[\"Enterprise Java\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2021\\\/05\\\/supporting-bulk-operations-in-rest-apis.html#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2021\\\/05\\\/supporting-bulk-operations-in-rest-apis.html\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2021\\\/05\\\/supporting-bulk-operations-in-rest-apis.html\",\"name\":\"Supporting bulk operations in REST APIs - Java Code Geeks\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2021\\\/05\\\/supporting-bulk-operations-in-rest-apis.html#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2021\\\/05\\\/supporting-bulk-operations-in-rest-apis.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/enterprise-java-logo.jpg\",\"datePublished\":\"2021-05-10T04:00:00+00:00\",\"description\":\"Interested to learn about bulk operations? Check our article explaining how to Support bulk operations in REST APIs.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2021\\\/05\\\/supporting-bulk-operations-in-rest-apis.html#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2021\\\/05\\\/supporting-bulk-operations-in-rest-apis.html\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2021\\\/05\\\/supporting-bulk-operations-in-rest-apis.html#primaryimage\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/enterprise-java-logo.jpg\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/enterprise-java-logo.jpg\",\"width\":150,\"height\":150,\"caption\":\"java-interview-questions-answers\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2021\\\/05\\\/supporting-bulk-operations-in-rest-apis.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Enterprise Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\\\/enterprise-java\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Supporting bulk operations in REST APIs\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"name\":\"Java Code Geeks\",\"description\":\"Java Developers Resource Center\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"alternateName\":\"JCG\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.javacodegeeks.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/javacodegeeks\",\"https:\\\/\\\/x.com\\\/javacodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/0f0f81e875d40e3f820392e0ffce65d1\",\"name\":\"Michael Scharhag\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/52283459bfc820fb6a66704b3eccc771a1d8a63a0bdbbe1651bb5cb383a42148?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/52283459bfc820fb6a66704b3eccc771a1d8a63a0bdbbe1651bb5cb383a42148?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/52283459bfc820fb6a66704b3eccc771a1d8a63a0bdbbe1651bb5cb383a42148?s=96&d=mm&r=g\",\"caption\":\"Michael Scharhag\"},\"description\":\"Michael Scharhag is a Java Developer, Blogger and technology enthusiast. Particularly interested in Java related technologies including Java EE, Spring, Groovy and Grails.\",\"sameAs\":[\"http:\\\/\\\/www.mscharhag.com\\\/\",\"https:\\\/\\\/x.com\\\/https:\\\/\\\/twitter.com\\\/mscharhag\"],\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/author\\\/michael-scharhag\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Supporting bulk operations in REST APIs - Java Code Geeks","description":"Interested to learn about bulk operations? Check our article explaining how to Support bulk operations in REST APIs.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.javacodegeeks.com\/2021\/05\/supporting-bulk-operations-in-rest-apis.html","og_locale":"en_US","og_type":"article","og_title":"Supporting bulk operations in REST APIs - Java Code Geeks","og_description":"Interested to learn about bulk operations? Check our article explaining how to Support bulk operations in REST APIs.","og_url":"https:\/\/www.javacodegeeks.com\/2021\/05\/supporting-bulk-operations-in-rest-apis.html","og_site_name":"Java Code Geeks","article_publisher":"https:\/\/www.facebook.com\/javacodegeeks","article_published_time":"2021-05-10T04:00:00+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","type":"image\/jpeg"}],"author":"Michael Scharhag","twitter_card":"summary_large_image","twitter_creator":"@https:\/\/twitter.com\/mscharhag","twitter_site":"@javacodegeeks","twitter_misc":{"Written by":"Michael Scharhag","Est. reading time":"13 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.javacodegeeks.com\/2021\/05\/supporting-bulk-operations-in-rest-apis.html#article","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/2021\/05\/supporting-bulk-operations-in-rest-apis.html"},"author":{"name":"Michael Scharhag","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/0f0f81e875d40e3f820392e0ffce65d1"},"headline":"Supporting bulk operations in REST APIs","datePublished":"2021-05-10T04:00:00+00:00","mainEntityOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2021\/05\/supporting-bulk-operations-in-rest-apis.html"},"wordCount":2086,"commentCount":0,"publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2021\/05\/supporting-bulk-operations-in-rest-apis.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","keywords":["REST"],"articleSection":["Enterprise Java"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.javacodegeeks.com\/2021\/05\/supporting-bulk-operations-in-rest-apis.html#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.javacodegeeks.com\/2021\/05\/supporting-bulk-operations-in-rest-apis.html","url":"https:\/\/www.javacodegeeks.com\/2021\/05\/supporting-bulk-operations-in-rest-apis.html","name":"Supporting bulk operations in REST APIs - Java Code Geeks","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2021\/05\/supporting-bulk-operations-in-rest-apis.html#primaryimage"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2021\/05\/supporting-bulk-operations-in-rest-apis.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","datePublished":"2021-05-10T04:00:00+00:00","description":"Interested to learn about bulk operations? Check our article explaining how to Support bulk operations in REST APIs.","breadcrumb":{"@id":"https:\/\/www.javacodegeeks.com\/2021\/05\/supporting-bulk-operations-in-rest-apis.html#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.javacodegeeks.com\/2021\/05\/supporting-bulk-operations-in-rest-apis.html"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/2021\/05\/supporting-bulk-operations-in-rest-apis.html#primaryimage","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","width":150,"height":150,"caption":"java-interview-questions-answers"},{"@type":"BreadcrumbList","@id":"https:\/\/www.javacodegeeks.com\/2021\/05\/supporting-bulk-operations-in-rest-apis.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.javacodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"Java","item":"https:\/\/www.javacodegeeks.com\/category\/java"},{"@type":"ListItem","position":3,"name":"Enterprise Java","item":"https:\/\/www.javacodegeeks.com\/category\/java\/enterprise-java"},{"@type":"ListItem","position":4,"name":"Supporting bulk operations in REST APIs"}]},{"@type":"WebSite","@id":"https:\/\/www.javacodegeeks.com\/#website","url":"https:\/\/www.javacodegeeks.com\/","name":"Java Code Geeks","description":"Java Developers Resource Center","publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"alternateName":"JCG","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.javacodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.javacodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.javacodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/javacodegeeks","https:\/\/x.com\/javacodegeeks"]},{"@type":"Person","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/0f0f81e875d40e3f820392e0ffce65d1","name":"Michael Scharhag","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/52283459bfc820fb6a66704b3eccc771a1d8a63a0bdbbe1651bb5cb383a42148?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/52283459bfc820fb6a66704b3eccc771a1d8a63a0bdbbe1651bb5cb383a42148?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/52283459bfc820fb6a66704b3eccc771a1d8a63a0bdbbe1651bb5cb383a42148?s=96&d=mm&r=g","caption":"Michael Scharhag"},"description":"Michael Scharhag is a Java Developer, Blogger and technology enthusiast. Particularly interested in Java related technologies including Java EE, Spring, Groovy and Grails.","sameAs":["http:\/\/www.mscharhag.com\/","https:\/\/x.com\/https:\/\/twitter.com\/mscharhag"],"url":"https:\/\/www.javacodegeeks.com\/author\/michael-scharhag"}]}},"_links":{"self":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/109976","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/users\/514"}],"replies":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/comments?post=109976"}],"version-history":[{"count":0,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/109976\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media\/112"}],"wp:attachment":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media?parent=109976"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/categories?post=109976"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/tags?post=109976"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}