当前位置: 首页 > 知识库问答 >
问题:

带有URL表单编码正文的Mule ESB HTTP POST请求

邹驰
2023-03-14

我是Mule ESB的新手,并尝试向REST服务发送post请求。请求的主体是字符串形式,请求应该是x-www-form-urlencoded。我将有效负载设置为我的参数并将请求发送给REST服务,但我得到了一个异常:

Failed to invoke REST service "http://username:password@192.168.10.252/api/rest/session/login.json". Message payload is of type: String

我的Rest URL是:(#[restURL])${dms.host}/api/Rest/session/login.json

我的参数是(设置为有效载荷#[restBody]):username=user&password=pass

<sub-flow name="RESTrequestToDMS" doc:name="RESTrequestToDMS" processingStrategy="synchronous">
    <set-variable variableName="originalMessage" value="#[payload]" doc:name="Backup original message"/>
    <logger message="#[restBody]" level="INFO" doc:name="Logger"/>
    <choice doc:name="Choice">
        <when expression="restHTTPmethod == 'POST'">
            <processor-chain>    
                <set-payload value="#[restBody]" doc:name="Set Payload"/>           
                <http:rest-service-component httpMethod="POST" serviceUrl="http://${dms.user}:${dms.pass}@#[restURL]"></http:rest-service-component>
            </processor-chain>
        </when>
        <when expression="restHTTPmethod == 'GET'">
            <processor-chain>
                <http:rest-service-component httpMethod="GET" serviceUrl="http://${dms.user}:${dms.pass}@#[restURL]?#[restBody]"></http:rest-service-component>
            </processor-chain>
        </when>
        <otherwise>
            <processor-chain>
                <logger message="Unknown http method type is provided! " level="ERROR" doc:name="Logger"/>
            </processor-chain>
        </otherwise>
    </choice>
    <json:json-to-object-transformer returnClass="java.util.Map" doc:name="JSON to Object"/>
    <echo-component doc:name="Echo"/>
    <set-variable variableName="RESTResponse" value="#[payload]" doc:name="set RESTResponse"/>
    <set-payload value="#[flowVars['originalMessage']]" doc:name="Restore Original Message"/>
</sub-flow>

谁能帮我弄清楚这件事吗?

提前多谢了。

注:根据David的回复更新。

------------更新-------------------------------

所以现在,出于测试的目的,我修改了流,如下所示:

<set-payload value="#[restBody]" doc:name="Set Payload"/>
<custom-transformer class="de.mfg.osii.http.StringToURIParametersMapTransformer" doc:name="String To URI Parameters"/>  
<http:rest-service-component httpMethod="POST" serviceUrl="http://${dms.user}:${dms.pass}@#[restURL]">
    <http:requiredParameter key="username" value="#[payload.get('username')]" />
    <http:requiredParameter key="password" value="#[payload.get('password')]" />
</http:rest-service-component>  

因此,现在的有效负载是:{username=user,password=pass},但现在当我尝试运行它时,我得到以下错误:

1. Failed to invoke REST service "http://user:pass@192.168.10.252/api/rest/session/login.json". Message payload is of type: LinkedHashMap (org.mule.transport.http.components.RestServiceException)

更新:通过添加一个值为“application/x-www-form-urlencoded”的message-property“content-type”,刚刚解决了上述问题,即异常。

不过,下面的最后一部分对我来说仍然是个谜:)

另一件事是,正如我在对David回答的注释中所述,我是否可以以自适应的方式为rest组件添加所需的参数?更清楚地说,我不想为每一个不同的请求创建不同的流。我在有效载荷中有参数映射,所以我想对它们进行迭代,并将它们放入所需的参数中。这样的事情可能发生吗?

提前多谢了!

------------更新-------------------------------

所以,我修改了我的流程并使用了David的建议。然而,现在,我得到一个HTTP405错误(方法不允许)。但我肯定我发帖到正确的地址和正确的内容类型。这是什么原因呢?有人有主意吗?

这个流中的有效负载是一个字符串(url编码的参数),比如->

SessionID=9EUB9GM7K7OC1UB81DHEF6T46Q&XML=%3CobjectList%3E%3CFolderObject%3E%3CaddToFolder%20RefType%3D%22Path%22%20ClassName%3D%22FolderObject%22%3E%3C!%5BCData%5B%2FoldDerPath%5D%5D%3E%3C%2FaddToFolder%3E%3C!%5BCData%5Baaa%5D%5D%3E%3C%2Name%3E%3C%3C

<flow name="RESTrequestToDMS" doc:name="RESTrequestToDMS" processingStrategy="synchronous">
    <set-variable variableName="originalMessage" value="#[payload]" doc:name="Backup original message"/>
    <choice doc:name="Choice">
        <when expression="restHTTPmethod == 'POST'">
            <processor-chain>
                <set-payload value="#[restBody]" doc:name="Set Payload"/>
                <logger message="The payload before http post is: #[message.payload]" level="INFO" doc:name="Logger"/>
                <http:outbound-endpoint  exchange-pattern="request-response" doc:name="HTTP" address="http://#[restURL]"  user="${dms.user}" password="${dms.pass}" contentType="application/x-www-form-urlencoded">
                </http:outbound-endpoint>
            </processor-chain>
        </when>
        <when expression="restHTTPmethod == 'GET'">
            <processor-chain>
                <http:outbound-endpoint method="GET"  exchange-pattern="request-response" doc:name="HTTP" address="http://#[restURL]?#[restBody]"  user="${dms.user}" password="${dms.pass}" contentType="application/x-www-form-urlencoded">
        </http:outbound-endpoint>
            </processor-chain>
        </when>
        <otherwise>
            <processor-chain>
                <logger message="Unknown http method type is provided! " level="ERROR" doc:name="Logger"/>
            </processor-chain>
        </otherwise>
    </choice>
    <echo-component doc:name="Echo"/>
    <choice doc:name="Choice">
        <when expression="payload != null &amp;&amp; payload != empty &amp;&amp; payload != ''">
            <processor-chain>
                <json:json-to-object-transformer doc:name="JSON to Object" returnClass="java.util.Map"/>
                <set-variable variableName="RESTResponse" value="#[payload]" doc:name="set RESTResponse"/>
            </processor-chain>
        </when>
        <otherwise>
            <processor-chain>
                <logger message="The payload is null or empty! HTTP response code is: #[message.inboundProperties['http.status']]" level="INFO" doc:name="Logger"/>
                <set-variable variableName="RESTResponse" value="#[message.inboundProperties['http.status']]" doc:name="Set HTTP Status Code"/>
            </processor-chain>
        </otherwise>
    </choice>
    <set-payload value="#[flowVars['originalMessage']]" doc:name="Restore Original Message"/>
</flow> 

共有1个答案

夏谦
2023-03-14

以下是如何传递参数以通过rest-service-component进行URL编码:

<http:rest-service-component httpMethod="POST"
    serviceUrl="http://${dms.user}:${dms.pass}@#[restURL]">
    <http:requiredParameter key="username" value="user" />
    <http:requiredParameter key="password" value="pass" />
</http:rest-service-component>
 类似资料:
  • 我有一个DropWizard项目,带有一个简单的表单提交endpoint: 我正在使用Swagger(swagger-jersey2-jaxrs 1.5.4)来记录我的API。但是,对于此endpoint,没有为表单参数生成文档。如果我更改

  • 我是Spring的新手,正在尝试用RestTemplate执行rest请求。Java代码应该执行与下面curl命令相同的操作: 但服务器拒绝了带有的RestTemplate

  • 我对邮递员有意见... 但是,当我尝试以 raw(json) 格式的正文发送相同的请求时,我得到了这个: 我试图通过Angular 5将数据发送到Drupal 8后端。 谢谢你!

  • 我有一个表单,它有一个输入字段,只要求一个有效的youtube url,没有逗号分隔的youtube url。我使用以下正则表达式验证youtube url的用户输入: 但如果用户输入逗号分隔的有效youtube链接,这些正则表达式就会失败。 我想要一个正则表达式,simpy只允许在输入字段中有一个有效的youtube链接。有人能在这方面帮我吗,因为我对regex还不熟悉? 例如: https:/

  • 响应:{“httpCode”:“400”,“httpMessage”:“请求错误”,“moreInformation”:“API请求中缺少一个或多个必需的API参数。”} 从日志中,我可以看到所有参数的传递方式如下:grant\u type=client\u credentials

  • 因此,我试图使用wiremck向带有请求正文的URL发出后请求,然后使用我的respons.json文件返回响应。(自定义响应) 我就是这样设置的,但我似乎找不到任何关于如何设置带有请求主体的post存根(包含数据,比如说尝试创建ID),然后检索自定义响应主体(从json文件创建ID响应)的信息。我该怎么设置呢。我尝试通过json文件请求生成id,然后尝试检索创建的id。 WithBodyFile