diff --git a/src/WireMock.Net.Minimal/Matchers/Request/RequestMessageBodyMatcher`1.cs b/src/WireMock.Net.Minimal/Matchers/Request/RequestMessageBodyMatcher`1.cs
new file mode 100644
index 00000000..2ee8a4ab
--- /dev/null
+++ b/src/WireMock.Net.Minimal/Matchers/Request/RequestMessageBodyMatcher`1.cs
@@ -0,0 +1,60 @@
+// Copyright © WireMock.Net
+
+using System;
+using Newtonsoft.Json.Linq;
+using Stef.Validation;
+
+namespace WireMock.Matchers.Request;
+
+///
+/// The request body matcher.
+///
+public class RequestMessageBodyMatcher : IRequestMatcher
+{
+ ///
+ /// The body data function for type T
+ ///
+ public Func? Func { get; }
+
+ ///
+ /// The
+ ///
+ public MatchOperator MatchOperator { get; } = MatchOperator.Or;
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The function.
+ public RequestMessageBodyMatcher(Func func)
+ {
+ Func = Guard.NotNull(func);
+ }
+
+ ///
+ public double GetMatchingScore(IRequestMessage requestMessage, IRequestMatchResult requestMatchResult)
+ {
+ var (score, exception) = CalculateMatchScore(requestMessage).Expand();
+ return requestMatchResult.AddScore(GetType(), score, exception);
+ }
+
+ private MatchResult CalculateMatchScore(IRequestMessage requestMessage)
+ {
+ if (Func != null)
+ {
+ if (requestMessage.BodyData?.BodyAsJson is JObject jsonObject)
+ {
+ try
+ {
+ var bodyAsT = jsonObject.ToObject();
+ return MatchScores.ToScore(Func(bodyAsT));
+ }
+ catch (Exception ex)
+ {
+ return new MatchResult(ex);
+ }
+ }
+ }
+
+ return default;
+ }
+}
\ No newline at end of file
diff --git a/src/WireMock.Net.Minimal/RequestBuilders/Request.WithBody.cs b/src/WireMock.Net.Minimal/RequestBuilders/Request.WithBody.cs
index fd840aae..1eec96da 100644
--- a/src/WireMock.Net.Minimal/RequestBuilders/Request.WithBody.cs
+++ b/src/WireMock.Net.Minimal/RequestBuilders/Request.WithBody.cs
@@ -34,13 +34,6 @@ public partial class Request
return this;
}
- ///
- public IRequestBuilder WithBodyAsJson(object body, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch)
- {
- var matcher = body as IMatcher ?? new JsonMatcher(matchBehaviour, body);
- return WithBody([matcher]);
- }
-
///
public IRequestBuilder WithBody(IMatcher matcher)
{
@@ -98,4 +91,20 @@ public partial class Request
_requestMatchers.Add(new RequestMessageBodyMatcher(Guard.NotNull(func)));
return this;
}
+
+ ///
+ public IRequestBuilder WithBodyAsJson(object body, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch)
+ {
+ var matcher = body as IMatcher ?? new JsonMatcher(matchBehaviour, body);
+ return WithBody([matcher]);
+ }
+
+ ///
+ public IRequestBuilder WithBodyAsType(Func func)
+ {
+ Guard.NotNull(func);
+
+ _requestMatchers.Add(new RequestMessageBodyMatcher(func));
+ return this;
+ }
}
\ No newline at end of file
diff --git a/src/WireMock.Net.Minimal/RequestBuilders/Request.cs b/src/WireMock.Net.Minimal/RequestBuilders/Request.cs
index 4071cf95..8b0d80c1 100644
--- a/src/WireMock.Net.Minimal/RequestBuilders/Request.cs
+++ b/src/WireMock.Net.Minimal/RequestBuilders/Request.cs
@@ -29,7 +29,7 @@ public partial class Request : RequestMessageCompositeMatcher, IRequestBuilder
/// The .
public static IRequestBuilder Create()
{
- return new Request(new List());
+ return new Request([]);
}
///
diff --git a/src/WireMock.Net.Shared/RequestBuilders/IBodyRequestBuilder.cs b/src/WireMock.Net.Shared/RequestBuilders/IBodyRequestBuilder.cs
index f22c1b33..1e049b91 100644
--- a/src/WireMock.Net.Shared/RequestBuilders/IBodyRequestBuilder.cs
+++ b/src/WireMock.Net.Shared/RequestBuilders/IBodyRequestBuilder.cs
@@ -80,6 +80,14 @@ public interface IBodyRequestBuilder : IMultiPartRequestBuilder
/// The .
IRequestBuilder WithBody(Func