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:responsechoiceraise…)进行验证,但我在 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>

来源:https://help.mulesoft.com/s/article/How-to-define-a-custom-HTTP-response-validator-in-Mule-Runtime-4-x