在 esb mule 中处理接受编码

Handling Accept encoding in esb mule

我的 mule flow 如下所示

    <?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 headers 中发现了差异。

RAW body 从邮​​递员到 requestb.in -

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."
  }
}

如需任何其他信息,请告诉我。提前致谢!

流程通过在 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>