This is an automated email from the ASF dual-hosted git repository.
asf-ci-deploy pushed a commit to branch asf-site-production
in repository https://gitbox.apache.org/repos/asf/grails-website.git
The following commit(s) were added to refs/heads/asf-site-production by this
push:
new 9638f559995 Deploying to documentation branch - 16:34:51
9638f559995 is described below
commit 9638f5599955340ebc46773dd2b7dc89e25a3123
Author: matrei <[email protected]>
AuthorDate: Mon Jun 15 16:34:53 2026 +0000
Deploying to documentation branch - 16:34:51
---
docs/snapshot/api/index-all.html | 2 +
.../testing/http/client/HttpClientSupport.html | 71 +++++++++++++---------
.../developer-manual/gettingStarted.html | 2 +-
.../grails-data/developer-manual/introduction.html | 2 +-
.../grails-data/developer-manual/stepByStep.html | 2 +-
.../grails-data/developer-manual/testing.html | 2 +-
.../developer-manual/understandingApi.html | 2 +-
.../understandingApi/datastoreBasics.html | 2 +-
.../understandingApi/gormApis.html | 2 +-
.../understandingApi/gormEnhancer.html | 2 +-
.../understandingApi/implementingCrud.html | 2 +-
.../understandingApi/implementingQueries.html | 2 +-
.../understandingApi/secondaryIndexes.html | 2 +-
.../grails-data/whats-new-manual/index.html | 2 +-
docs/snapshot/guide/introduction.html | 8 +++
docs/snapshot/guide/single.html | 28 ++++++++-
docs/snapshot/guide/testing.html | 18 ++++++
docs/snapshot/index.html | 2 +-
18 files changed, 111 insertions(+), 42 deletions(-)
diff --git a/docs/snapshot/api/index-all.html b/docs/snapshot/api/index-all.html
index 798eff08379..859e03f68d0 100644
--- a/docs/snapshot/api/index-all.html
+++ b/docs/snapshot/api/index-all.html
@@ -26042,6 +26042,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block">PATCH XML generated by the provided
groovy.xml.MarkupBuilder DSL closure.</div></dd>
<dt><span class="strong"><a
href="org/apache/grails/testing/http/client/HttpClientSupport.html#httpPost(Map<String,
String>, java.lang.CharSequence, java.lang.CharSequence,
java.lang.CharSequence, java.net.http.HttpClient)" title="Method in
HttpClientSupport">httpPost(Map<String, String>, java.lang.CharSequence,
java.lang.CharSequence, java.lang.CharSequence,
java.net.http.HttpClient)</a></span> - Method in <a
href="org/apache/grails/testing/http/client/HttpClientSupport.html">Http [...]
</dt><dd> <div class="block">POST request.</div></dd>
+<dt><span class="strong"><a
href="org/apache/grails/testing/http/client/HttpClientSupport.html#httpPostForm(Map<String,
String>, java.lang.CharSequence, Map<String, ?>, java.net.http.HttpClient)"
title="Method in HttpClientSupport">httpPostForm(Map<String, String>,
java.lang.CharSequence, Map<String, ?>,
java.net.http.HttpClient)</a></span> - Method in <a
href="org/apache/grails/testing/http/client/HttpClientSupport.html">HttpClientSupport</a>
+</dt><dd> <div class="block">POST form data as
<CODE>application/x-www-form-urlencoded</CODE> (UTF-8).</div></dd>
<dt><span class="strong"><a
href="org/apache/grails/testing/http/client/HttpClientSupport.html#httpPostJson(Map<String,
String>, java.lang.CharSequence, groovy.json.JsonGenerator, Map<String,
Object>, java.net.http.HttpClient)" title="Method in
HttpClientSupport">httpPostJson(Map<String, String>,
java.lang.CharSequence, groovy.json.JsonGenerator, Map<String, Object>,
java.net.http.HttpClient)</a></span> - Method in <a
href="org/apache/grails/testing/http/client/HttpClientSupp [...]
</dt><dd> <div class="block">POST JSON payload from java.util.Map.</div></dd>
<dt><span class="strong"><a
href="org/apache/grails/testing/http/client/HttpClientSupport.html#httpPostMultipart(Map<String,
String>, java.lang.CharSequence,
org.apache.grails.testing.http.client.MultipartBody, java.net.http.HttpClient)"
title="Method in HttpClientSupport">httpPostMultipart(Map<String,
String>, java.lang.CharSequence,
org.apache.grails.testing.http.client.MultipartBody,
java.net.http.HttpClient)</a></span> - Method in <a
href="org/apache/grails/testing/http/client/ [...]
diff --git
a/docs/snapshot/api/org/apache/grails/testing/http/client/HttpClientSupport.html
b/docs/snapshot/api/org/apache/grails/testing/http/client/HttpClientSupport.html
index 73457fdeddd..1e58f0a77e1 100644
---
a/docs/snapshot/api/org/apache/grails/testing/http/client/HttpClientSupport.html
+++
b/docs/snapshot/api/org/apache/grails/testing/http/client/HttpClientSupport.html
@@ -385,172 +385,178 @@ extends java.lang.Object</pre>
<tr class="rowColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code><a
href='../../../../../../org/apache/grails/testing/http/client/TestHttpResponse.html'>TestHttpResponse</a></code></td>
- <td class="colLast"><code><strong><a
href="#httpPostJson(Map, java.lang.CharSequence, java.lang.CharSequence,
java.net.http.HttpClient)">httpPostJson</a></strong>(java.util.Map<java.lang.String,
java.lang.String> headers, java.lang.CharSequence pathOrUrl,
java.lang.CharSequence body, java.net.http.HttpClient client)</code><br>POST
JSON string payload.</td>
+ <td class="colLast"><code><strong><a
href="#httpPostForm(Map, java.lang.CharSequence, Map,
java.net.http.HttpClient)">httpPostForm</a></strong>(java.util.Map<java.lang.String,
java.lang.String> headers, java.lang.CharSequence pathOrUrl,
java.util.Map<java.lang.String, ?> formData, java.net.http.HttpClient
client)</code><br>POST form data as
<CODE>application/x-www-form-urlencoded</CODE> (UTF-8).</td>
</tr>
<tr class="altColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code><a
href='../../../../../../org/apache/grails/testing/http/client/TestHttpResponse.html'>TestHttpResponse</a></code></td>
- <td class="colLast"><code><strong><a
href="#httpPostJson(java.lang.CharSequence, groovy.json.JsonGenerator,
Map)">httpPostJson</a></strong>(java.lang.CharSequence pathOrUrl, <a
href='../../../../../../groovy.json.JsonGenerator.html'>JsonGenerator</a>
jsonGenerator, java.util.Map<java.lang.String, java.lang.Object>
body)</code><br>POST JSON payload from java.util.Map.</td>
+ <td class="colLast"><code><strong><a
href="#httpPostJson(Map, java.lang.CharSequence, java.lang.CharSequence,
java.net.http.HttpClient)">httpPostJson</a></strong>(java.util.Map<java.lang.String,
java.lang.String> headers, java.lang.CharSequence pathOrUrl,
java.lang.CharSequence body, java.net.http.HttpClient client)</code><br>POST
JSON string payload.</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code><a
href='../../../../../../org/apache/grails/testing/http/client/TestHttpResponse.html'>TestHttpResponse</a></code></td>
- <td class="colLast"><code><strong><a
href="#httpPostJson(java.lang.CharSequence, groovy.json.JsonGenerator, Map,
java.net.http.HttpClient)">httpPostJson</a></strong>(java.lang.CharSequence
pathOrUrl, <a
href='../../../../../../groovy.json.JsonGenerator.html'>JsonGenerator</a>
jsonGenerator, java.util.Map<java.lang.String, java.lang.Object> body,
java.net.http.HttpClient client)</code><br>POST JSON payload from
java.util.Map.</td>
+ <td class="colLast"><code><strong><a
href="#httpPostJson(java.lang.CharSequence, groovy.json.JsonGenerator,
Map)">httpPostJson</a></strong>(java.lang.CharSequence pathOrUrl, <a
href='../../../../../../groovy.json.JsonGenerator.html'>JsonGenerator</a>
jsonGenerator, java.util.Map<java.lang.String, java.lang.Object>
body)</code><br>POST JSON payload from java.util.Map.</td>
</tr>
<tr class="altColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code><a
href='../../../../../../org/apache/grails/testing/http/client/TestHttpResponse.html'>TestHttpResponse</a></code></td>
- <td class="colLast"><code><strong><a
href="#httpPostJson(Map, java.lang.CharSequence, groovy.json.JsonGenerator,
Map)">httpPostJson</a></strong>(java.util.Map<java.lang.String,
java.lang.String> headers, java.lang.CharSequence pathOrUrl, <a
href='../../../../../../groovy.json.JsonGenerator.html'>JsonGenerator</a>
jsonGenerator, java.util.Map<java.lang.String, java.lang.Object>
body)</code><br>POST JSON payload from java.util.Map.</td>
+ <td class="colLast"><code><strong><a
href="#httpPostJson(java.lang.CharSequence, groovy.json.JsonGenerator, Map,
java.net.http.HttpClient)">httpPostJson</a></strong>(java.lang.CharSequence
pathOrUrl, <a
href='../../../../../../groovy.json.JsonGenerator.html'>JsonGenerator</a>
jsonGenerator, java.util.Map<java.lang.String, java.lang.Object> body,
java.net.http.HttpClient client)</code><br>POST JSON payload from
java.util.Map.</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code><a
href='../../../../../../org/apache/grails/testing/http/client/TestHttpResponse.html'>TestHttpResponse</a></code></td>
- <td class="colLast"><code><strong><a
href="#httpPostJson(Map, java.lang.CharSequence, groovy.json.JsonGenerator,
Map,
java.net.http.HttpClient)">httpPostJson</a></strong>(java.util.Map<java.lang.String,
java.lang.String> headers, java.lang.CharSequence pathOrUrl, <a
href='../../../../../../groovy.json.JsonGenerator.html'>JsonGenerator</a>
jsonGenerator, java.util.Map<java.lang.String, java.lang.Object> body,
java.net.http.HttpClient client)</code>< [...]
+ <td class="colLast"><code><strong><a
href="#httpPostJson(Map, java.lang.CharSequence, groovy.json.JsonGenerator,
Map)">httpPostJson</a></strong>(java.util.Map<java.lang.String,
java.lang.String> headers, java.lang.CharSequence pathOrUrl, <a
href='../../../../../../groovy.json.JsonGenerator.html'>JsonGenerator</a>
jsonGenerator, java.util.Map<java.lang.String, java.lang.Object>
body)</code><br>POST JSON payload from java.util.Map.</td>
</tr>
<tr class="altColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code><a
href='../../../../../../org/apache/grails/testing/http/client/TestHttpResponse.html'>TestHttpResponse</a></code></td>
- <td class="colLast"><code><strong><a
href="#httpPostMultipart(java.lang.CharSequence,
org.apache.grails.testing.http.client.MultipartBody,
java.net.http.HttpClient)">httpPostMultipart</a></strong>(java.lang.CharSequence
pathOrUrl, <a
href='../../../../../../org/apache/grails/testing/http/client/MultipartBody.html'>MultipartBody</a>
body, java.net.http.HttpClient client)</code><br>POST multipart payload.</td>
+ <td class="colLast"><code><strong><a
href="#httpPostJson(Map, java.lang.CharSequence, groovy.json.JsonGenerator,
Map,
java.net.http.HttpClient)">httpPostJson</a></strong>(java.util.Map<java.lang.String,
java.lang.String> headers, java.lang.CharSequence pathOrUrl, <a
href='../../../../../../groovy.json.JsonGenerator.html'>JsonGenerator</a>
jsonGenerator, java.util.Map<java.lang.String, java.lang.Object> body,
java.net.http.HttpClient client)</code>< [...]
</tr>
<tr class="rowColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code><a
href='../../../../../../org/apache/grails/testing/http/client/TestHttpResponse.html'>TestHttpResponse</a></code></td>
- <td class="colLast"><code><strong><a
href="#httpPostMultipart(Map, java.lang.CharSequence,
org.apache.grails.testing.http.client.MultipartBody,
java.net.http.HttpClient)">httpPostMultipart</a></strong>(java.util.Map<java.lang.String,
java.lang.String> headers, java.lang.CharSequence pathOrUrl, <a
href='../../../../../../org/apache/grails/testing/http/client/MultipartBody.html'>MultipartBody</a>
body, java.net.http.HttpClient client)</code><br>POST multip [...]
+ <td class="colLast"><code><strong><a
href="#httpPostMultipart(java.lang.CharSequence,
org.apache.grails.testing.http.client.MultipartBody,
java.net.http.HttpClient)">httpPostMultipart</a></strong>(java.lang.CharSequence
pathOrUrl, <a
href='../../../../../../org/apache/grails/testing/http/client/MultipartBody.html'>MultipartBody</a>
body, java.net.http.HttpClient client)</code><br>POST multipart payload.</td>
</tr>
<tr class="altColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code><a
href='../../../../../../org/apache/grails/testing/http/client/TestHttpResponse.html'>TestHttpResponse</a></code></td>
- <td class="colLast"><code><strong><a
href="#httpPostXml(Map, java.lang.CharSequence, java.lang.CharSequence,
java.net.http.HttpClient)">httpPostXml</a></strong>(java.util.Map<java.lang.String,
java.lang.String> headers, java.lang.CharSequence pathOrUrl,
java.lang.CharSequence body, java.net.http.HttpClient client)</code><br>POST
XML string payload.</td>
+ <td class="colLast"><code><strong><a
href="#httpPostMultipart(Map, java.lang.CharSequence,
org.apache.grails.testing.http.client.MultipartBody,
java.net.http.HttpClient)">httpPostMultipart</a></strong>(java.util.Map<java.lang.String,
java.lang.String> headers, java.lang.CharSequence pathOrUrl, <a
href='../../../../../../org/apache/grails/testing/http/client/MultipartBody.html'>MultipartBody</a>
body, java.net.http.HttpClient client)</code><br>POST multip [...]
</tr>
<tr class="rowColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code><a
href='../../../../../../org/apache/grails/testing/http/client/TestHttpResponse.html'>TestHttpResponse</a></code></td>
- <td class="colLast"><code><strong><a
href="#httpPostXml(java.lang.CharSequence,
org.apache.grails.testing.http.client.utils.XmlUtils.Format,
Closure)">httpPostXml</a></strong>(java.lang.CharSequence pathOrUrl, <a
href='../../../../../../org/apache/grails/testing/http/client/utils/XmlUtils.Format.html'>Format</a>
format, groovy.lang.Closure<?> body)</code><br>POST XML generated by the
provided groovy.xml.MarkupBuilder DSL closure.</td>
+ <td class="colLast"><code><strong><a
href="#httpPostXml(Map, java.lang.CharSequence, java.lang.CharSequence,
java.net.http.HttpClient)">httpPostXml</a></strong>(java.util.Map<java.lang.String,
java.lang.String> headers, java.lang.CharSequence pathOrUrl,
java.lang.CharSequence body, java.net.http.HttpClient client)</code><br>POST
XML string payload.</td>
</tr>
<tr class="altColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code><a
href='../../../../../../org/apache/grails/testing/http/client/TestHttpResponse.html'>TestHttpResponse</a></code></td>
- <td class="colLast"><code><strong><a
href="#httpPostXml(java.lang.CharSequence,
org.apache.grails.testing.http.client.utils.XmlUtils.Format, Closure,
java.net.http.HttpClient)">httpPostXml</a></strong>(java.lang.CharSequence
pathOrUrl, <a
href='../../../../../../org/apache/grails/testing/http/client/utils/XmlUtils.Format.html'>Format</a>
format, groovy.lang.Closure<?> body, java.net.http.HttpClient
client)</code><br>POST XML generated by the provided gro [...]
+ <td class="colLast"><code><strong><a
href="#httpPostXml(java.lang.CharSequence,
org.apache.grails.testing.http.client.utils.XmlUtils.Format,
Closure)">httpPostXml</a></strong>(java.lang.CharSequence pathOrUrl, <a
href='../../../../../../org/apache/grails/testing/http/client/utils/XmlUtils.Format.html'>Format</a>
format, groovy.lang.Closure<?> body)</code><br>POST XML generated by the
provided groovy.xml.MarkupBuilder DSL closure.</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code><a
href='../../../../../../org/apache/grails/testing/http/client/TestHttpResponse.html'>TestHttpResponse</a></code></td>
- <td class="colLast"><code><strong><a
href="#httpPostXml(Map, java.lang.CharSequence,
org.apache.grails.testing.http.client.utils.XmlUtils.Format,
Closure)">httpPostXml</a></strong>(java.util.Map<java.lang.String,
java.lang.String> headers, java.lang.CharSequence pathOrUrl, <a
href='../../../../../../org/apache/grails/testing/http/client/utils/XmlUtils.Format.html'>Format</a>
format, groovy.lang.Closure<?> body)</code><br>POST XML generated by the
p [...]
+ <td class="colLast"><code><strong><a
href="#httpPostXml(java.lang.CharSequence,
org.apache.grails.testing.http.client.utils.XmlUtils.Format, Closure,
java.net.http.HttpClient)">httpPostXml</a></strong>(java.lang.CharSequence
pathOrUrl, <a
href='../../../../../../org/apache/grails/testing/http/client/utils/XmlUtils.Format.html'>Format</a>
format, groovy.lang.Closure<?> body, java.net.http.HttpClient
client)</code><br>POST XML generated by the provided gro [...]
</tr>
<tr class="altColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code><a
href='../../../../../../org/apache/grails/testing/http/client/TestHttpResponse.html'>TestHttpResponse</a></code></td>
- <td class="colLast"><code><strong><a
href="#httpPostXml(Map, java.lang.CharSequence,
org.apache.grails.testing.http.client.utils.XmlUtils.Format, Closure,
java.net.http.HttpClient)">httpPostXml</a></strong>(java.util.Map<java.lang.String,
java.lang.String> headers, java.lang.CharSequence pathOrUrl, <a
href='../../../../../../org/apache/grails/testing/http/client/utils/XmlUtils.Format.html'>Format</a>
format, groovy.lang.Closure<?> body, java.net.ht [...]
+ <td class="colLast"><code><strong><a
href="#httpPostXml(Map, java.lang.CharSequence,
org.apache.grails.testing.http.client.utils.XmlUtils.Format,
Closure)">httpPostXml</a></strong>(java.util.Map<java.lang.String,
java.lang.String> headers, java.lang.CharSequence pathOrUrl, <a
href='../../../../../../org/apache/grails/testing/http/client/utils/XmlUtils.Format.html'>Format</a>
format, groovy.lang.Closure<?> body)</code><br>POST XML generated by the
p [...]
</tr>
<tr class="rowColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code><a
href='../../../../../../org/apache/grails/testing/http/client/TestHttpResponse.html'>TestHttpResponse</a></code></td>
- <td class="colLast"><code><strong><a
href="#httpPut(Map, java.lang.CharSequence, java.lang.CharSequence,
java.lang.CharSequence,
java.net.http.HttpClient)">httpPut</a></strong>(java.util.Map<java.lang.String,
java.lang.String> headers, java.lang.CharSequence pathOrUrl,
java.lang.CharSequence body, java.lang.CharSequence contentType,
java.net.http.HttpClient client)</code><br>PUT request.</td>
+ <td class="colLast"><code><strong><a
href="#httpPostXml(Map, java.lang.CharSequence,
org.apache.grails.testing.http.client.utils.XmlUtils.Format, Closure,
java.net.http.HttpClient)">httpPostXml</a></strong>(java.util.Map<java.lang.String,
java.lang.String> headers, java.lang.CharSequence pathOrUrl, <a
href='../../../../../../org/apache/grails/testing/http/client/utils/XmlUtils.Format.html'>Format</a>
format, groovy.lang.Closure<?> body, java.net.ht [...]
</tr>
<tr class="altColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code><a
href='../../../../../../org/apache/grails/testing/http/client/TestHttpResponse.html'>TestHttpResponse</a></code></td>
- <td class="colLast"><code><strong><a
href="#httpPutJson(Map, java.lang.CharSequence, java.lang.CharSequence,
java.net.http.HttpClient)">httpPutJson</a></strong>(java.util.Map<java.lang.String,
java.lang.String> headers, java.lang.CharSequence pathOrUrl,
java.lang.CharSequence body, java.net.http.HttpClient client)</code><br>PUT
JSON string payload.</td>
+ <td class="colLast"><code><strong><a
href="#httpPut(Map, java.lang.CharSequence, java.lang.CharSequence,
java.lang.CharSequence,
java.net.http.HttpClient)">httpPut</a></strong>(java.util.Map<java.lang.String,
java.lang.String> headers, java.lang.CharSequence pathOrUrl,
java.lang.CharSequence body, java.lang.CharSequence contentType,
java.net.http.HttpClient client)</code><br>PUT request.</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code><a
href='../../../../../../org/apache/grails/testing/http/client/TestHttpResponse.html'>TestHttpResponse</a></code></td>
- <td class="colLast"><code><strong><a
href="#httpPutJson(java.lang.CharSequence, groovy.json.JsonGenerator,
Map)">httpPutJson</a></strong>(java.lang.CharSequence pathOrUrl, <a
href='../../../../../../groovy.json.JsonGenerator.html'>JsonGenerator</a>
jsonGenerator, java.util.Map<java.lang.String, java.lang.Object>
body)</code><br>PUT JSON payload from java.util.Map.</td>
+ <td class="colLast"><code><strong><a
href="#httpPutJson(Map, java.lang.CharSequence, java.lang.CharSequence,
java.net.http.HttpClient)">httpPutJson</a></strong>(java.util.Map<java.lang.String,
java.lang.String> headers, java.lang.CharSequence pathOrUrl,
java.lang.CharSequence body, java.net.http.HttpClient client)</code><br>PUT
JSON string payload.</td>
</tr>
<tr class="altColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code><a
href='../../../../../../org/apache/grails/testing/http/client/TestHttpResponse.html'>TestHttpResponse</a></code></td>
- <td class="colLast"><code><strong><a
href="#httpPutJson(java.lang.CharSequence, groovy.json.JsonGenerator, Map,
java.net.http.HttpClient)">httpPutJson</a></strong>(java.lang.CharSequence
pathOrUrl, <a
href='../../../../../../groovy.json.JsonGenerator.html'>JsonGenerator</a>
jsonGenerator, java.util.Map<java.lang.String, java.lang.Object> body,
java.net.http.HttpClient client)</code><br>PUT JSON payload from
java.util.Map.</td>
+ <td class="colLast"><code><strong><a
href="#httpPutJson(java.lang.CharSequence, groovy.json.JsonGenerator,
Map)">httpPutJson</a></strong>(java.lang.CharSequence pathOrUrl, <a
href='../../../../../../groovy.json.JsonGenerator.html'>JsonGenerator</a>
jsonGenerator, java.util.Map<java.lang.String, java.lang.Object>
body)</code><br>PUT JSON payload from java.util.Map.</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code><a
href='../../../../../../org/apache/grails/testing/http/client/TestHttpResponse.html'>TestHttpResponse</a></code></td>
- <td class="colLast"><code><strong><a
href="#httpPutJson(Map, java.lang.CharSequence, groovy.json.JsonGenerator,
Map)">httpPutJson</a></strong>(java.util.Map<java.lang.String,
java.lang.String> headers, java.lang.CharSequence pathOrUrl, <a
href='../../../../../../groovy.json.JsonGenerator.html'>JsonGenerator</a>
jsonGenerator, java.util.Map<java.lang.String, java.lang.Object>
body)</code><br>PUT JSON payload from java.util.Map.</td>
+ <td class="colLast"><code><strong><a
href="#httpPutJson(java.lang.CharSequence, groovy.json.JsonGenerator, Map,
java.net.http.HttpClient)">httpPutJson</a></strong>(java.lang.CharSequence
pathOrUrl, <a
href='../../../../../../groovy.json.JsonGenerator.html'>JsonGenerator</a>
jsonGenerator, java.util.Map<java.lang.String, java.lang.Object> body,
java.net.http.HttpClient client)</code><br>PUT JSON payload from
java.util.Map.</td>
</tr>
<tr class="altColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code><a
href='../../../../../../org/apache/grails/testing/http/client/TestHttpResponse.html'>TestHttpResponse</a></code></td>
- <td class="colLast"><code><strong><a
href="#httpPutJson(Map, java.lang.CharSequence, groovy.json.JsonGenerator, Map,
java.net.http.HttpClient)">httpPutJson</a></strong>(java.util.Map<java.lang.String,
java.lang.String> headers, java.lang.CharSequence pathOrUrl, <a
href='../../../../../../groovy.json.JsonGenerator.html'>JsonGenerator</a>
jsonGenerator, java.util.Map<java.lang.String, java.lang.Object> body,
java.net.http.HttpClient client)</code><br [...]
+ <td class="colLast"><code><strong><a
href="#httpPutJson(Map, java.lang.CharSequence, groovy.json.JsonGenerator,
Map)">httpPutJson</a></strong>(java.util.Map<java.lang.String,
java.lang.String> headers, java.lang.CharSequence pathOrUrl, <a
href='../../../../../../groovy.json.JsonGenerator.html'>JsonGenerator</a>
jsonGenerator, java.util.Map<java.lang.String, java.lang.Object>
body)</code><br>PUT JSON payload from java.util.Map.</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code><a
href='../../../../../../org/apache/grails/testing/http/client/TestHttpResponse.html'>TestHttpResponse</a></code></td>
- <td class="colLast"><code><strong><a
href="#httpPutXml(java.lang.CharSequence,
org.apache.grails.testing.http.client.utils.XmlUtils.Format,
Closure)">httpPutXml</a></strong>(java.lang.CharSequence pathOrUrl, <a
href='../../../../../../org/apache/grails/testing/http/client/utils/XmlUtils.Format.html'>Format</a>
format, groovy.lang.Closure<?> body)</code><br>PUT XML generated by the
provided groovy.xml.MarkupBuilder DSL closure.</td>
+ <td class="colLast"><code><strong><a
href="#httpPutJson(Map, java.lang.CharSequence, groovy.json.JsonGenerator, Map,
java.net.http.HttpClient)">httpPutJson</a></strong>(java.util.Map<java.lang.String,
java.lang.String> headers, java.lang.CharSequence pathOrUrl, <a
href='../../../../../../groovy.json.JsonGenerator.html'>JsonGenerator</a>
jsonGenerator, java.util.Map<java.lang.String, java.lang.Object> body,
java.net.http.HttpClient client)</code><br [...]
</tr>
<tr class="altColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code><a
href='../../../../../../org/apache/grails/testing/http/client/TestHttpResponse.html'>TestHttpResponse</a></code></td>
- <td class="colLast"><code><strong><a
href="#httpPutXml(java.lang.CharSequence,
org.apache.grails.testing.http.client.utils.XmlUtils.Format, Closure,
java.net.http.HttpClient)">httpPutXml</a></strong>(java.lang.CharSequence
pathOrUrl, <a
href='../../../../../../org/apache/grails/testing/http/client/utils/XmlUtils.Format.html'>Format</a>
format, groovy.lang.Closure<?> body, java.net.http.HttpClient
client)</code><br>PUT XML generated by the provided groovy [...]
+ <td class="colLast"><code><strong><a
href="#httpPutXml(java.lang.CharSequence,
org.apache.grails.testing.http.client.utils.XmlUtils.Format,
Closure)">httpPutXml</a></strong>(java.lang.CharSequence pathOrUrl, <a
href='../../../../../../org/apache/grails/testing/http/client/utils/XmlUtils.Format.html'>Format</a>
format, groovy.lang.Closure<?> body)</code><br>PUT XML generated by the
provided groovy.xml.MarkupBuilder DSL closure.</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code><a
href='../../../../../../org/apache/grails/testing/http/client/TestHttpResponse.html'>TestHttpResponse</a></code></td>
- <td class="colLast"><code><strong><a
href="#httpPutXml(Map, java.lang.CharSequence,
org.apache.grails.testing.http.client.utils.XmlUtils.Format,
Closure)">httpPutXml</a></strong>(java.util.Map<java.lang.String,
java.lang.String> headers, java.lang.CharSequence pathOrUrl, <a
href='../../../../../../org/apache/grails/testing/http/client/utils/XmlUtils.Format.html'>Format</a>
format, groovy.lang.Closure<?> body)</code><br>PUT XML generated by the
prov [...]
+ <td class="colLast"><code><strong><a
href="#httpPutXml(java.lang.CharSequence,
org.apache.grails.testing.http.client.utils.XmlUtils.Format, Closure,
java.net.http.HttpClient)">httpPutXml</a></strong>(java.lang.CharSequence
pathOrUrl, <a
href='../../../../../../org/apache/grails/testing/http/client/utils/XmlUtils.Format.html'>Format</a>
format, groovy.lang.Closure<?> body, java.net.http.HttpClient
client)</code><br>PUT XML generated by the provided groovy [...]
</tr>
<tr class="altColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code><a
href='../../../../../../org/apache/grails/testing/http/client/TestHttpResponse.html'>TestHttpResponse</a></code></td>
- <td class="colLast"><code><strong><a
href="#httpPutXml(Map, java.lang.CharSequence,
org.apache.grails.testing.http.client.utils.XmlUtils.Format, Closure,
java.net.http.HttpClient)">httpPutXml</a></strong>(java.util.Map<java.lang.String,
java.lang.String> headers, java.lang.CharSequence pathOrUrl, <a
href='../../../../../../org/apache/grails/testing/http/client/utils/XmlUtils.Format.html'>Format</a>
format, groovy.lang.Closure<?> body, java.net.http [...]
+ <td class="colLast"><code><strong><a
href="#httpPutXml(Map, java.lang.CharSequence,
org.apache.grails.testing.http.client.utils.XmlUtils.Format,
Closure)">httpPutXml</a></strong>(java.util.Map<java.lang.String,
java.lang.String> headers, java.lang.CharSequence pathOrUrl, <a
href='../../../../../../org/apache/grails/testing/http/client/utils/XmlUtils.Format.html'>Format</a>
format, groovy.lang.Closure<?> body)</code><br>PUT XML generated by the
prov [...]
</tr>
<tr class="rowColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code><a
href='../../../../../../org/apache/grails/testing/http/client/TestHttpResponse.html'>TestHttpResponse</a></code></td>
- <td class="colLast"><code><strong><a
href="#httpTrace(java.lang.CharSequence)">httpTrace</a></strong>(java.lang.CharSequence
pathOrUrl)</code><br>TRACE request.</td>
+ <td class="colLast"><code><strong><a
href="#httpPutXml(Map, java.lang.CharSequence,
org.apache.grails.testing.http.client.utils.XmlUtils.Format, Closure,
java.net.http.HttpClient)">httpPutXml</a></strong>(java.util.Map<java.lang.String,
java.lang.String> headers, java.lang.CharSequence pathOrUrl, <a
href='../../../../../../org/apache/grails/testing/http/client/utils/XmlUtils.Format.html'>Format</a>
format, groovy.lang.Closure<?> body, java.net.http [...]
</tr>
<tr class="altColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code><a
href='../../../../../../org/apache/grails/testing/http/client/TestHttpResponse.html'>TestHttpResponse</a></code></td>
- <td class="colLast"><code><strong><a
href="#httpTrace(java.lang.CharSequence,
java.net.http.HttpClient)">httpTrace</a></strong>(java.lang.CharSequence
pathOrUrl, java.net.http.HttpClient client)</code><br>TRACE request.</td>
+ <td class="colLast"><code><strong><a
href="#httpTrace(java.lang.CharSequence)">httpTrace</a></strong>(java.lang.CharSequence
pathOrUrl)</code><br>TRACE request.</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code><a
href='../../../../../../org/apache/grails/testing/http/client/TestHttpResponse.html'>TestHttpResponse</a></code></td>
- <td class="colLast"><code><strong><a
href="#httpTrace(Map,
java.lang.CharSequence)">httpTrace</a></strong>(java.util.Map<java.lang.String,
java.lang.String> headers, java.lang.CharSequence
pathOrUrl)</code><br>TRACE request.</td>
+ <td class="colLast"><code><strong><a
href="#httpTrace(java.lang.CharSequence,
java.net.http.HttpClient)">httpTrace</a></strong>(java.lang.CharSequence
pathOrUrl, java.net.http.HttpClient client)</code><br>TRACE request.</td>
</tr>
<tr class="altColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code><a
href='../../../../../../org/apache/grails/testing/http/client/TestHttpResponse.html'>TestHttpResponse</a></code></td>
- <td class="colLast"><code><strong><a
href="#httpTrace(Map, java.lang.CharSequence,
java.net.http.HttpClient)">httpTrace</a></strong>(java.util.Map<java.lang.String,
java.lang.String> headers, java.lang.CharSequence pathOrUrl,
java.net.http.HttpClient client)</code><br>TRACE request.</td>
+ <td class="colLast"><code><strong><a
href="#httpTrace(Map,
java.lang.CharSequence)">httpTrace</a></strong>(java.util.Map<java.lang.String,
java.lang.String> headers, java.lang.CharSequence
pathOrUrl)</code><br>TRACE request.</td>
</tr>
<tr class="rowColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code><a
href='../../../../../../org/apache/grails/testing/http/client/TestHttpResponse.html'>TestHttpResponse</a></code></td>
+ <td class="colLast"><code><strong><a
href="#httpTrace(Map, java.lang.CharSequence,
java.net.http.HttpClient)">httpTrace</a></strong>(java.util.Map<java.lang.String,
java.lang.String> headers, java.lang.CharSequence pathOrUrl,
java.net.http.HttpClient client)</code><br>TRACE request.</td>
+ </tr>
+
+ <tr class="altColor">
<td class="colFirst"><code></code></td>
<td
class="colLast"><code>java.net.http.HttpClient</code></td>
<td class="colLast"><code><strong><a
href="#newHttpClientWith(Closure)">newHttpClientWith</a></strong>(groovy.lang.Closure<?>
configurer)</code><br>Creates an java.net.http.HttpClient with default
configuration and optional customizations.</td>
</tr>
- <tr class="altColor">
+ <tr class="rowColor">
<td class="colFirst"><code></code></td>
<td
class="colLast"><code>java.net.http.HttpRequest</code></td>
<td class="colLast"><code><strong><a
href="#newHttpRequestWith(java.lang.CharSequence,
Closure)">newHttpRequestWith</a></strong>(java.lang.CharSequence pathOrUrl,
groovy.lang.Closure<?> configurer)</code><br>Creates an
java.net.http.HttpRequest with default configuration and optional
customizations.</td>
</tr>
- <tr class="rowColor">
+ <tr class="altColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code><a
href='../../../../../../org/apache/grails/testing/http/client/TestHttpResponse.html'>TestHttpResponse</a></code></td>
<td class="colLast"><code><strong><a
href="#sendHttpRequest(java.net.http.HttpRequest,
java.net.http.HttpClient)">sendHttpRequest</a></strong>(java.net.http.HttpRequest
request, java.net.http.HttpClient client)</code><br>Sends a pre-built
request.</td>
@@ -864,6 +870,15 @@ extends java.lang.Object</pre>
</li>
</ul>
+ <a name="httpPostForm(Map, java.lang.CharSequence,
Map, java.net.http.HttpClient)"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4><a
href='../../../../../../org/apache/grails/testing/http/client/TestHttpResponse.html'>TestHttpResponse</a>
<strong>httpPostForm</strong>(java.util.Map<java.lang.String,
java.lang.String> headers, java.lang.CharSequence pathOrUrl,
java.util.Map<java.lang.String, ?> formData, java.net.http.HttpClient
client)</h4>
+ <p> POST form data as
<CODE>application/x-www-form-urlencoded</CODE> (UTF-8).
<DL><DT><B>Parameters:</B></DT><DD><code>headers</code> - optional request
headers</DD><DD><code>pathOrUrl</code> - relative path or absolute
URL</DD><DD><code>formData</code> - form fields to encode into the request
body; collection and array values are encoded as
+ repeated keys</DD><DD><code>client</code> - optional
java.net.http.HttpClient instance to
use</DD></DL><DL><DT><B>Returns:</B></DT><DD>response with String
body</DD></DL></p>
+ </li>
+ </ul>
+
<a name="httpPostJson(Map, java.lang.CharSequence,
java.lang.CharSequence, java.net.http.HttpClient)"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
diff --git a/docs/snapshot/grails-data/developer-manual/gettingStarted.html
b/docs/snapshot/grails-data/developer-manual/gettingStarted.html
index f56ed5ebfad..df73b0ac917 100644
--- a/docs/snapshot/grails-data/developer-manual/gettingStarted.html
+++ b/docs/snapshot/grails-data/developer-manual/gettingStarted.html
@@ -523,7 +523,7 @@ cd grails-core</pre>
<div id="footer">
<div id="footer-text">
Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-06-11 22:54:25 UTC
+Last updated 2026-06-14 11:51:31 UTC
</div>
</div>
</body>
diff --git a/docs/snapshot/grails-data/developer-manual/introduction.html
b/docs/snapshot/grails-data/developer-manual/introduction.html
index 0b401fbab12..6f621eb85ab 100644
--- a/docs/snapshot/grails-data/developer-manual/introduction.html
+++ b/docs/snapshot/grails-data/developer-manual/introduction.html
@@ -476,7 +476,7 @@ body.book #toc,body.book #preamble,body.book
h1.sect0,body.book .sect1>h2{page-b
<div id="footer">
<div id="footer-text">
Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-06-11 22:54:25 UTC
+Last updated 2026-06-14 11:51:31 UTC
</div>
</div>
</body>
diff --git a/docs/snapshot/grails-data/developer-manual/stepByStep.html
b/docs/snapshot/grails-data/developer-manual/stepByStep.html
index 2411c77addb..fa9042098cd 100644
--- a/docs/snapshot/grails-data/developer-manual/stepByStep.html
+++ b/docs/snapshot/grails-data/developer-manual/stepByStep.html
@@ -621,7 +621,7 @@ class XyzTestSuite {
<div id="footer">
<div id="footer-text">
Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-06-11 22:54:25 UTC
+Last updated 2026-06-14 11:51:31 UTC
</div>
</div>
</body>
diff --git a/docs/snapshot/grails-data/developer-manual/testing.html
b/docs/snapshot/grails-data/developer-manual/testing.html
index 72bf82938a2..79d988242c7 100644
--- a/docs/snapshot/grails-data/developer-manual/testing.html
+++ b/docs/snapshot/grails-data/developer-manual/testing.html
@@ -511,7 +511,7 @@ class PagedResultSpec extends GormDatastoreSpec{
<div id="footer">
<div id="footer-text">
Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-06-11 22:54:25 UTC
+Last updated 2026-06-14 11:51:31 UTC
</div>
</div>
</body>
diff --git a/docs/snapshot/grails-data/developer-manual/understandingApi.html
b/docs/snapshot/grails-data/developer-manual/understandingApi.html
index 23ce9b894c7..2b7b4f4aa5a 100644
--- a/docs/snapshot/grails-data/developer-manual/understandingApi.html
+++ b/docs/snapshot/grails-data/developer-manual/understandingApi.html
@@ -454,7 +454,7 @@ body.book #toc,body.book #preamble,body.book
h1.sect0,body.book .sect1>h2{page-b
<div id="footer">
<div id="footer-text">
Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-06-11 22:54:25 UTC
+Last updated 2026-06-14 11:51:31 UTC
</div>
</div>
</body>
diff --git
a/docs/snapshot/grails-data/developer-manual/understandingApi/datastoreBasics.html
b/docs/snapshot/grails-data/developer-manual/understandingApi/datastoreBasics.html
index 4cc98e3ccd7..cbf3ebefc0d 100644
---
a/docs/snapshot/grails-data/developer-manual/understandingApi/datastoreBasics.html
+++
b/docs/snapshot/grails-data/developer-manual/understandingApi/datastoreBasics.html
@@ -561,7 +561,7 @@ protected Session createSession(PropertyResolver
connDetails) {
<div id="footer">
<div id="footer-text">
Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-06-11 22:54:25 UTC
+Last updated 2026-06-14 11:51:31 UTC
</div>
</div>
</body>
diff --git
a/docs/snapshot/grails-data/developer-manual/understandingApi/gormApis.html
b/docs/snapshot/grails-data/developer-manual/understandingApi/gormApis.html
index 94f1bdbbdf0..571c61ba14c 100644
--- a/docs/snapshot/grails-data/developer-manual/understandingApi/gormApis.html
+++ b/docs/snapshot/grails-data/developer-manual/understandingApi/gormApis.html
@@ -496,7 +496,7 @@ class Neo4jEntityTraitProvider implements
GormEntityTraitProvider {
<div id="footer">
<div id="footer-text">
Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-06-11 22:54:25 UTC
+Last updated 2026-06-14 11:51:31 UTC
</div>
</div>
</body>
diff --git
a/docs/snapshot/grails-data/developer-manual/understandingApi/gormEnhancer.html
b/docs/snapshot/grails-data/developer-manual/understandingApi/gormEnhancer.html
index 69d4e5239e9..82190e63913 100644
---
a/docs/snapshot/grails-data/developer-manual/understandingApi/gormEnhancer.html
+++
b/docs/snapshot/grails-data/developer-manual/understandingApi/gormEnhancer.html
@@ -488,7 +488,7 @@ enhancer.enhance()</code></pre>
<div id="footer">
<div id="footer-text">
Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-06-11 22:54:25 UTC
+Last updated 2026-06-14 11:51:31 UTC
</div>
</div>
</body>
diff --git
a/docs/snapshot/grails-data/developer-manual/understandingApi/implementingCrud.html
b/docs/snapshot/grails-data/developer-manual/understandingApi/implementingCrud.html
index 6cb693ea112..74a7ba49f8e 100644
---
a/docs/snapshot/grails-data/developer-manual/understandingApi/implementingCrud.html
+++
b/docs/snapshot/grails-data/developer-manual/understandingApi/implementingCrud.html
@@ -673,7 +673,7 @@ protected void deleteEntry(String family, final Object key,
final Object entry)
<div id="footer">
<div id="footer-text">
Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-06-11 22:54:25 UTC
+Last updated 2026-06-14 11:51:31 UTC
</div>
</div>
</body>
diff --git
a/docs/snapshot/grails-data/developer-manual/understandingApi/implementingQueries.html
b/docs/snapshot/grails-data/developer-manual/understandingApi/implementingQueries.html
index 130bd4c1215..feb82b92d3b 100644
---
a/docs/snapshot/grails-data/developer-manual/understandingApi/implementingQueries.html
+++
b/docs/snapshot/grails-data/developer-manual/understandingApi/implementingQueries.html
@@ -588,7 +588,7 @@ If, for instance, the underlying datastore does not support
the calculation of a
<div id="footer">
<div id="footer-text">
Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-06-11 22:54:25 UTC
+Last updated 2026-06-14 11:51:31 UTC
</div>
</div>
</body>
diff --git
a/docs/snapshot/grails-data/developer-manual/understandingApi/secondaryIndexes.html
b/docs/snapshot/grails-data/developer-manual/understandingApi/secondaryIndexes.html
index 1a4eeded4e9..a7568dbb534 100644
---
a/docs/snapshot/grails-data/developer-manual/understandingApi/secondaryIndexes.html
+++
b/docs/snapshot/grails-data/developer-manual/understandingApi/secondaryIndexes.html
@@ -526,7 +526,7 @@ If the underlying datastore supports secondary indexes then
it is ok to just ret
<div id="footer">
<div id="footer-text">
Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-06-11 22:54:25 UTC
+Last updated 2026-06-14 11:51:31 UTC
</div>
</div>
</body>
diff --git a/docs/snapshot/grails-data/whats-new-manual/index.html
b/docs/snapshot/grails-data/whats-new-manual/index.html
index fb43fea4f4a..a5733dcc3bf 100644
--- a/docs/snapshot/grails-data/whats-new-manual/index.html
+++ b/docs/snapshot/grails-data/whats-new-manual/index.html
@@ -527,7 +527,7 @@ body.book #toc,body.book #preamble,body.book
h1.sect0,body.book .sect1>h2{page-b
<div id="footer">
<div id="footer-text">
Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-06-11 22:54:25 UTC
+Last updated 2026-06-14 11:51:31 UTC
</div>
</div>
</body>
diff --git a/docs/snapshot/guide/introduction.html
b/docs/snapshot/guide/introduction.html
index 26030143955..3c344d75d13 100644
--- a/docs/snapshot/guide/introduction.html
+++ b/docs/snapshot/guide/introduction.html
@@ -320,6 +320,14 @@ Method-defined tags now bind named attributes more
predictably, exclude inherite
Tests that use <code>TagLibUnitTest</code> no longer need to manage
<code>purgeTagLibMetaClass</code>, and specs that mock additional tag libraries
continue to work across feature methods.</p>
</div>
</div>
+<div class="sect3">
+<h4 id="_test_http_client_form_requests">Test HTTP Client Form Requests</h4>
+<div class="paragraph">
+<p>Integration tests that implement <code>HttpClientSupport</code> can now use
<code>httpPostForm(…​)</code> to send
<code>application/x-www-form-urlencoded</code>
+request bodies. The helper URL-encodes form fields using UTF-8, and repeated
values in a <code>Collection</code> or array are encoded as
+repeated keys in insertion order.</p>
+</div>
+</div>
</div>
diff --git a/docs/snapshot/guide/single.html b/docs/snapshot/guide/single.html
index 3381bb2a3ac..d05bf0d9410 100644
--- a/docs/snapshot/guide/single.html
+++ b/docs/snapshot/guide/single.html
@@ -138,7 +138,7 @@ Companies deploy assistants like this [](https://kapa.ai)
on docs via [website w
<div class="project">
<h1>The Grails Framework</h1>
<p><strong>Authors:</strong> The Apache Grails
Team</p>
- <p><strong>Version:</strong> <span
style='display:inline-block;'><select
onChange='window.document.location.href=this.options[this.selectedIndex].value;'><option
selected='selected'
value='https://grails.apache.org/docs/snapshot/guide/single.html'>SNAPSHOT</option><option
value='https://grails.apache.org/docs/8.0.0-M1/guide/single.html'>8.0.0-M1</option><option
selected='selected'
value='https://grails.apache.org/docs/snapshot/guide/single.html'>8.0.0-SNA
[...]
+ <p><strong>Version:</strong> <span
style='display:inline-block;'><select
onChange='window.document.location.href=this.options[this.selectedIndex].value;'><option
selected='selected'
value='https://grails.apache.org/docs/snapshot/guide/single.html'>SNAPSHOT</option><option
selected='selected'
value='https://grails.apache.org/docs/snapshot/guide/single.html'>8.0.0-SNAPSHOT</option></select></span></p>
</div>
@@ -883,6 +883,14 @@ Method-defined tags now bind named attributes more
predictably, exclude inherite
Tests that use <code>TagLibUnitTest</code> no longer need to manage
<code>purgeTagLibMetaClass</code>, and specs that mock additional tag libraries
continue to work across feature methods.</p>
</div>
</div>
+<div class="sect3">
+<h4 id="_test_http_client_form_requests">Test HTTP Client Form Requests</h4>
+<div class="paragraph">
+<p>Integration tests that implement <code>HttpClientSupport</code> can now use
<code>httpPostForm(…​)</code> to send
<code>application/x-www-form-urlencoded</code>
+request bodies. The helper URL-encodes form fields using UTF-8, and repeated
values in a <code>Collection</code> or array are encoded as
+repeated keys in insertion order.</p>
+</div>
+</div>
</div>
@@ -33067,6 +33075,14 @@ request building and response assertions:</p>
response.assertJsonContains([<span class="key">title</span>: <span
class="string"><span class="delimiter">'</span><span class="content">Grails in
Action</span><span class="delimiter">'</span></span>])
}
+ <span class="type">void</span> <span class="string"><span
class="delimiter">'</span><span class="content">Posting form data</span><span
class="delimiter">'</span></span>() {
+ <span class="key">when</span>: <span class="string"><span
class="delimiter">'</span><span class="content">you post a map it is turned
into an application/x-www-form-urlencoded payload</span><span
class="delimiter">'</span></span>
+ <span class="keyword">def</span> response = httpPostForm(<span
class="string"><span class="delimiter">'</span><span
class="content">/api/search</span><span class="delimiter">'</span></span>,
[<span class="key">query</span>: <span class="string"><span
class="delimiter">'</span><span class="content">grails core</span><span
class="delimiter">'</span></span>, <span class="key">tag</span>: [<span
class="string"><span class="delimiter">'</span><span
class="content">web</span><span clas [...]
+
+ <span class="key">then</span>:
+ response.assertStatus(<span class="integer">200</span>)
+ }
+
<span class="type">void</span> <span class="string"><span
class="delimiter">'</span><span class="content">Posting and verifying
XML</span><span class="delimiter">'</span></span>() {
<span class="key">when</span>: <span class="string"><span
class="delimiter">'</span><span class="content">you can post XML using a
builder</span><span class="delimiter">'</span></span>
<span class="keyword">def</span> response = httpPostXml(<span
class="string"><span class="delimiter">'</span><span
class="content">/api/books</span><span class="delimiter">'</span></span>) {
@@ -33123,6 +33139,16 @@ request building and response assertions:</p>
and <code>newHttpClientWith(Closure configurer)</code> to customize your own
client and requests starting from the defaults.</p>
</div>
<div class="paragraph">
+<p><code>httpPostForm(…​)</code> sends
<code>application/x-www-form-urlencoded</code> request bodies. Pass a
<code>Map</code> of form fields, and the
+helper will URL-encode each entry using UTF-8. Scalar values are encoded once,
while <code>Collection</code> and array values are
+encoded as repeated keys in insertion order:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy">httpPostForm(<span
class="string"><span class="delimiter">'</span><span
class="content">/search</span><span class="delimiter">'</span></span>, [<span
class="key">query</span>: <span class="string"><span
class="delimiter">'</span><span class="content">grails core</span><span
class="delimiter">'</span></span>, <span class="key">tag</span>: [<span
class="string"><span class="delimiter">'</span><span
class="content">web</span><span clas [...]
+</div>
+</div>
+<div class="paragraph">
<p>Additional request helper methods available include
<code>httpDelete()</code>, <code>httpHead()</code>, <code>httpOptions()</code>,
<code>httpPatch()</code>,
<code>httpPut()</code>, <code>httpTrace()</code>, and many assertion methods
on responses.</p>
</div>
diff --git a/docs/snapshot/guide/testing.html b/docs/snapshot/guide/testing.html
index 25a4aa4de5a..a191977e991 100644
--- a/docs/snapshot/guide/testing.html
+++ b/docs/snapshot/guide/testing.html
@@ -2701,6 +2701,14 @@ request building and response assertions:</p>
response.assertJsonContains([<span class="key">title</span>: <span
class="string"><span class="delimiter">'</span><span class="content">Grails in
Action</span><span class="delimiter">'</span></span>])
}
+ <span class="type">void</span> <span class="string"><span
class="delimiter">'</span><span class="content">Posting form data</span><span
class="delimiter">'</span></span>() {
+ <span class="key">when</span>: <span class="string"><span
class="delimiter">'</span><span class="content">you post a map it is turned
into an application/x-www-form-urlencoded payload</span><span
class="delimiter">'</span></span>
+ <span class="keyword">def</span> response = httpPostForm(<span
class="string"><span class="delimiter">'</span><span
class="content">/api/search</span><span class="delimiter">'</span></span>,
[<span class="key">query</span>: <span class="string"><span
class="delimiter">'</span><span class="content">grails core</span><span
class="delimiter">'</span></span>, <span class="key">tag</span>: [<span
class="string"><span class="delimiter">'</span><span
class="content">web</span><span clas [...]
+
+ <span class="key">then</span>:
+ response.assertStatus(<span class="integer">200</span>)
+ }
+
<span class="type">void</span> <span class="string"><span
class="delimiter">'</span><span class="content">Posting and verifying
XML</span><span class="delimiter">'</span></span>() {
<span class="key">when</span>: <span class="string"><span
class="delimiter">'</span><span class="content">you can post XML using a
builder</span><span class="delimiter">'</span></span>
<span class="keyword">def</span> response = httpPostXml(<span
class="string"><span class="delimiter">'</span><span
class="content">/api/books</span><span class="delimiter">'</span></span>) {
@@ -2757,6 +2765,16 @@ request building and response assertions:</p>
and <code>newHttpClientWith(Closure configurer)</code> to customize your own
client and requests starting from the defaults.</p>
</div>
<div class="paragraph">
+<p><code>httpPostForm(…​)</code> sends
<code>application/x-www-form-urlencoded</code> request bodies. Pass a
<code>Map</code> of form fields, and the
+helper will URL-encode each entry using UTF-8. Scalar values are encoded once,
while <code>Collection</code> and array values are
+encoded as repeated keys in insertion order:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy">httpPostForm(<span
class="string"><span class="delimiter">'</span><span
class="content">/search</span><span class="delimiter">'</span></span>, [<span
class="key">query</span>: <span class="string"><span
class="delimiter">'</span><span class="content">grails core</span><span
class="delimiter">'</span></span>, <span class="key">tag</span>: [<span
class="string"><span class="delimiter">'</span><span
class="content">web</span><span clas [...]
+</div>
+</div>
+<div class="paragraph">
<p>Additional request helper methods available include
<code>httpDelete()</code>, <code>httpHead()</code>, <code>httpOptions()</code>,
<code>httpPatch()</code>,
<code>httpPut()</code>, <code>httpTrace()</code>, and many assertion methods
on responses.</p>
</div>
diff --git a/docs/snapshot/index.html b/docs/snapshot/index.html
index 753828babb2..45de278b3d1 100644
--- a/docs/snapshot/index.html
+++ b/docs/snapshot/index.html
@@ -138,7 +138,7 @@ Companies deploy assistants like this [](https://kapa.ai)
on docs via [website w
<div class="project">
<h1>The Grails Framework</h1>
<p><strong>Authors:</strong> The Apache Grails
Team</p>
- <p><strong>Version:</strong> <span
style='display:inline-block;'><select
onChange='window.document.location.href=this.options[this.selectedIndex].value;'><option
selected='selected'
value='https://grails.apache.org/docs/snapshot/index.html'>SNAPSHOT</option><option
value='https://grails.apache.org/docs/8.0.0-M1/index.html'>8.0.0-M1</option><option
selected='selected'
value='https://grails.apache.org/docs/snapshot/index.html'>8.0.0-SNAPSHOT</option><option
[...]
+ <p><strong>Version:</strong> <span
style='display:inline-block;'><select
onChange='window.document.location.href=this.options[this.selectedIndex].value;'><option
selected='selected'
value='https://grails.apache.org/docs/snapshot/index.html'>SNAPSHOT</option><option
selected='selected'
value='https://grails.apache.org/docs/snapshot/index.html'>8.0.0-SNAPSHOT</option></select></span></p>
</div>