处理esb mule中的接受编码

时间:2016-03-14 20:55:41

标签: api http-headers mule gzip esb

我的骡子流看起来像下面

    <?xml version="1.0" encoding="UTF-8"?>
<mule xmlns:metadata="http://www.mulesoft.org/schema/mule/metadata" xmlns:scripting="http://www.mulesoft.org/schema/mule/scripting" xmlns:json="http://www.mulesoft.org/schema/mule/json" xmlns:http="http://www.mulesoft.org/schema/mule/http" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation"
    xmlns:spring="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd
http://www.mulesoft.org/schema/mule/json http://www.mulesoft.org/schema/mule/json/current/mule-json.xsd
http://www.mulesoft.org/schema/mule/scripting http://www.mulesoft.org/schema/mule/scripting/current/mule-scripting.xsd">
    <http:listener-config name="HTTP_Listener_Configuration" host="0.0.0.0" port="8111" doc:name="HTTP Listener Configuration"/>
    <http:request-config name="HTTP_Request_Configuration"  host="api.bonanza.com" port="443" doc:name="HTTP Request Configuration" protocol="HTTPS"/>
    <flow name="bonanza_fetchtoken_ceFlow">
        <http:listener config-ref="HTTP_Listener_Configuration" path="/add" allowedMethods="GET,POST" doc:name="HTTP" />
        <flow-ref name="bonanza_addfixedpriceitemSub_Flow" doc:name="bonanza_addfixedpriceitemSub_Flow"/>
    </flow>
    <sub-flow name="bonanza_addfixedpriceitemSub_Flow">
        <message-properties-transformer doc:name="Message Properties">
            <add-message-property key="X-BONANZLE-API-DEV-NAME" value="t******I"/>
            <add-message-property key="X-BONANZLE-API-CERT-NAME" value="l*****F"/>
        </message-properties-transformer>
        <set-property propertyName="Content-Type" value="application/x-www-form-urlencoded" doc:name="Property"/>
        <set-property propertyName="Accept" value="application/json" doc:name="Property"/>
        <set-variable variableName="sim" value="{requesterCredentials:{bonanzleAuthToken:nWn1a9l3NT}}" doc:name="Variable"/>
        <scripting:transformer returnClass="java.util.Map" doc:name="Groovy">
            <scripting:script engine="Groovy"><![CDATA[import groovy.json.JsonBuilder
m = [addFixedPriceItemRequest:'{requesterCredentials:{bonanzleAuthToken:n*****T}}']
builder = new JsonBuilder()
builder(m)

]]></scripting:script>
        </scripting:transformer>

        <logger message="payload :#[payload]" level="INFO" doc:name="Logger"/>
        <http:request config-ref="HTTP_Request_Configuration" path="/api_requests/secure_request" method="POST" followRedirects="true" parseResponse="false" doc:name="HTTP">
            <http:success-status-code-validator values="0..599"/>
        </http:request>
        <logger message="resp :#[message.payloadAs(java.lang.String)]" level="INFO" doc:name="Logger"/>
    </sub-flow>
</mule>

我能够使用postman工具从API接收成功的响应。我尝试使用上面的ESB骡子流模拟相同的事情。但API会给我一个错误,如下所示。因此我使用requestb.in来比较来自esb mule和postman工具的请求。我发现仅HTTP标题存在差异。

从邮递员到requestb.in的RAW身体 -

addFixedPriceItemRequest={requesterCredentials:{bonanzleAuthToken:nW*****NT}}

RAW Body从ESB mule到requestb.in

addFixedPriceItemRequest=%7BrequesterCredentials%3A%7BbonanzleAuthToken%3AnW****NT%7D%7D

似乎我必须在发送内容类型之前序列化json内容 - application / x-www-form-urlencoded。我在此mule doc

中找到了此信息

如何在groovy中序列化json有效负载并作为映射有效负载发送?

API错误响应

{
  "ack": "Failure",
  "version": "1.0beta",
  "timestamp": "2016-03-15T07:18:11.000Z",
  "errorMessage": {
    "message": "Cannot determine what type of request you are making. Often this can be the result of data that has not been escaped before being passed to the API. If you are passing data with quotation marks or other special characters, you should translate it to JSON, then escape it, before sending it over the API."
  }
}

如有任何其他信息,请与我们联系。提前谢谢!

1 个答案:

答案 0 :(得分:1)

通过在http组件中的查询参数中添加键值对来实现流程。 flowVariable requestpayload有json字符串。所以我的Mule http组件如下所示。

<http:request config-ref="HTTP_Request_Configuration" path="/api_requests/secure_request" method="POST" followRedirects="true" parseResponse="false" doc:name="HTTP">
            <http:request-builder>
                <http:query-param paramName="addFixedPriceItemRequest" value="#[flowVars.requestpayload]"/>
            </http:request-builder>
            <http:success-status-code-validator values="0..599"/>
        </http:request>