mule 中 http:request 中的 responseValidator 中的表达式
Expression in responseValidator in http:request in mule
我在 mule 4.4 社区版 (MuleSoft 4 ce) 中使用 mule-http-connector
版本 1.6.0
,我得到了响应(又名 GraphQL):
{
"success": true,
"data": ...
}
我想通过检查成功字段来验证响应。我可以通过使用两个…四个组件(http:response
、choice
、raise
…)进行验证,但我在 Anypoint Studio 7.11 中的组件属性中找到了 «Reponse» → «Response validator» → «表达式或 Bean 引用»。我不想使用 «Bean reference» 并编写 java 代码,但我想使用 «Expression»。我写道:
%dw 2.0
output application/json
---
payload.success
但是我得到了错误:
"org.mule.weave.v2.exception.UnexpectedFunctionCallTypesException: You called the function 'Value Selector' with these arguments:
1: Binary ("" as Binary {base: "64"})
2: Name ("success")
如果我写点什么:
%dw 2.0
output application/json
---
true
我遇到了那个错误:
org.mule.weave.v2.exception.WriterExecutionException: Unable to convert 'true' with class 'java.lang.Boolean' to class 'ResponseValidator'
4| true
^^^^
Trace:
at anonymous::main (line: 4, column: 1), while writing Java at
4| true
^^^^.
4| true
^^^^
Trace:
at anonymous::main (line: 4, column: 1)
" evaluating expression: "%dw 2.0
output application/json
---
true".
如何在响应验证中编写 dw 表达式?
这不是应该使用响应验证的方式。默认情况下 - 当使用字符串时 - 它根据字符串中的状态代码范围验证 HTTP 状态代码。如果你想实现你的自定义验证,你必须扩展 Java class org.mule.extension.http.api.request.validator.RangeStatusCodeValidator.
示例:
public class MyValidator extends RangeStatusCodeValidator {
public MyValidator() {}
public MyValidator(String values) {
setValues(values);
}
@Override
public void validate(Result<InputStream, HttpResponseAttributes> result, HttpRequest request) {
int status = result.getAttributes().get().getStatusCode();
String method = request.getMethod();
if ((!belongs(status)) && (!method.equals("GET"))) {
throwValidationException(result, request, status);
}
}
}
然后在您的流程中实例化它并在响应验证器中引用它:
<java:new doc:name="New" class="validator.MyValidator" constructor='MyValidator(String)' target="out">
<java:args ><![CDATA[#[{arg0:"500"}]]]></java:args>
</java:new>
<http:request method="POST" doc:name="Request" config-ref="HTTP_Request_configuration" responseValidator='#[vars.out]' path="/endpoint">
</http:request>
或者您可以从 DataWeave 实例化 class:
<http:request method="POST" doc:name="Request" config-ref="HTTP_Request_configuration" responseValidator='#[%dw 2.0 import java!validator::MyValidator output application/java --- MyValidator::new("500")]' path="/endpoint">
</http:request>
我在 mule 4.4 社区版 (MuleSoft 4 ce) 中使用 mule-http-connector
版本 1.6.0
,我得到了响应(又名 GraphQL):
{
"success": true,
"data": ...
}
我想通过检查成功字段来验证响应。我可以通过使用两个…四个组件(http:response
、choice
、raise
…)进行验证,但我在 Anypoint Studio 7.11 中的组件属性中找到了 «Reponse» → «Response validator» → «表达式或 Bean 引用»。我不想使用 «Bean reference» 并编写 java 代码,但我想使用 «Expression»。我写道:
%dw 2.0
output application/json
---
payload.success
但是我得到了错误:
"org.mule.weave.v2.exception.UnexpectedFunctionCallTypesException: You called the function 'Value Selector' with these arguments: 1: Binary ("" as Binary {base: "64"}) 2: Name ("success")
如果我写点什么:
%dw 2.0
output application/json
---
true
我遇到了那个错误:
org.mule.weave.v2.exception.WriterExecutionException: Unable to convert 'true' with class 'java.lang.Boolean' to class 'ResponseValidator' 4| true ^^^^ Trace: at anonymous::main (line: 4, column: 1), while writing Java at 4| true ^^^^. 4| true ^^^^ Trace: at anonymous::main (line: 4, column: 1) " evaluating expression: "%dw 2.0 output application/json --- true".
如何在响应验证中编写 dw 表达式?
这不是应该使用响应验证的方式。默认情况下 - 当使用字符串时 - 它根据字符串中的状态代码范围验证 HTTP 状态代码。如果你想实现你的自定义验证,你必须扩展 Java class org.mule.extension.http.api.request.validator.RangeStatusCodeValidator.
示例:
public class MyValidator extends RangeStatusCodeValidator {
public MyValidator() {}
public MyValidator(String values) {
setValues(values);
}
@Override
public void validate(Result<InputStream, HttpResponseAttributes> result, HttpRequest request) {
int status = result.getAttributes().get().getStatusCode();
String method = request.getMethod();
if ((!belongs(status)) && (!method.equals("GET"))) {
throwValidationException(result, request, status);
}
}
}
然后在您的流程中实例化它并在响应验证器中引用它:
<java:new doc:name="New" class="validator.MyValidator" constructor='MyValidator(String)' target="out">
<java:args ><![CDATA[#[{arg0:"500"}]]]></java:args>
</java:new>
<http:request method="POST" doc:name="Request" config-ref="HTTP_Request_configuration" responseValidator='#[vars.out]' path="/endpoint">
</http:request>
或者您可以从 DataWeave 实例化 class:
<http:request method="POST" doc:name="Request" config-ref="HTTP_Request_configuration" responseValidator='#[%dw 2.0 import java!validator::MyValidator output application/java --- MyValidator::new("500")]' path="/endpoint">
</http:request>