2012-10-25 111 views
0

我在尝试构建一个Web服务,该服务接受许多用于构建Bing查询API路径的变量。出于某种原因,如果我构建URI,我的流程将识别新的URI已正确分配给有效内容,但是当我将有效内容分配给出站HTTP端点时,它将失败。Mule ESB动态设置端点路径

<flow name="BingQuery" doc:name="BingQuery"> 
     <http:inbound-endpoint exchange-pattern="one-way" host="localhost" port="8082" doc:name="HTTP" /> 
     <set-variable variableName="query" doc:name="Variable" value="#[header:INBOUND:query]"/> 
     <set-variable variableName="numResults" doc:name="Variable" value="#[header:INBOUND:top]"/> 
     <set-variable variableName="offsetResults" doc:name="Variable" value="#[header:INBOUND:offset]"/> 
     <scripting:component doc:name="Groovy"> 
      <scripting:script engine="Groovy"> 
       <scripting:text><![CDATA[def query = message.getInvocationProperty("query") 
       def numResults = message.getInvocationProperty("numResults") 
       def offsetResults = message.getInvocationProperty("offsetResults") 
       def path = "Data.ashx/Bing/Search/v1/Web?Query=" + "$query" + "&amp;WebFileType=%27PDF%27&amp;\$top=" + "$numResults" + "&amp;\$skip=" + "$offsetResults" + "&amp;\$format=Json" 
        println "$path" 
        message.setProperty("pathVar","$path") 
        return null;]]></scripting:text> 
      </scripting:script> 
     </scripting:component> 
     <logger level="INFO" doc:name="Logger" message="#[header:OUTBOUND:pathVar]"/> 
     <https:outbound-endpoint exchange-pattern="request-response" 
      host="api.datamarket.azure.com" port="443" path="#[header:OUTBOUND:pathVar]" 
      user="*****" password="******" 
      doc:name="Bing" /> ... 

我得到的例外是

ERROR 2012-10-25 14:14:26,250 [[poll_directory].BingQuery.stage1.02] org.mule.exception.DefaultMessagingExceptionStrategy: 
******************************************************************************** 
Message    : Failed to transform from "json" to "java.util.Map" 
Code     : MULE_ERROR-65110 
-------------------------------------------------------------------------------- 
Exception stack is: 
1. Unexpected character ('T' (code 84)): expected a valid value (number, String, array, object, 'true', 'false' or 'null') 
at [Source: [email protected]; line: 1, column: 2] (org.codehaus.jackson.JsonParseException) 
org.codehaus.jackson.JsonParser:1291 (null) 
2. Failed to transform from "json" to "java.util.Map" (org.mule.api.transformer.TransformerException) 
org.mule.module.json.transformers.JsonToObject:136 (http://www.mulesoft.org/docs/site/current3/apidocs/org/mule/api/transformer/TransformerException.html) 
-------------------------------------------------------------------------------- 
Root Exception stack trace: 
org.codehaus.jackson.JsonParseException: Unexpected character ('T' (code 84)): expected a valid value (number, String, array, object, 'true', 'false' or 'null') 
at [Source: [email protected]; line: 1, column: 2] 
    at org.codehaus.jackson.JsonParser._constructError(JsonParser.java:1291) 
    at org.codehaus.jackson.impl.JsonParserMinimalBase._reportError(JsonParserMinimalBase.java:385) 
    at org.codehaus.jackson.impl.JsonParserMinimalBase._reportUnexpectedChar(JsonParserMinimalBase.java:306) 
    + 3 more (set debug level logging or '-Dmule.verbose.exceptions=true' for everything) 
******************************************************************************** 

必须有它不工作,原因很简单,我敢肯定,这只是因为我不知道正确的语法,但在骡子。我也知道,使用MEL和Groovy可能有更好的方法来实现这一点,但我对MEL还不够熟悉。

SOLUTION

原来一些用户属性和密码属性的特征被发送之前进行编码的。在传递给用户密码属性之前,将该密钥放入一个变量中可以防止并取得成功。

<?xml version="1.0" encoding="UTF-8"?> 

<mule xmlns:scripting="http://www.mulesoft.org/schema/mule/scripting" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:json="http://www.mulesoft.org/schema/mule/json" 
    xmlns:vm="http://www.mulesoft.org/schema/mule/vm" xmlns:http="http://www.mulesoft.org/schema/mule/http" 
    xmlns:https="http://www.mulesoft.org/schema/mule/https" xmlns:file="http://www.mulesoft.org/schema/mule/file" 
    xmlns:doc="http://www.mulesoft.org/schema/mule/documentation" 
    xmlns:spring="http://www.springframework.org/schema/beans" xmlns:core="http://www.mulesoft.org/schema/mule/core" 
    version="CE-3.3.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation=" 
http://www.mulesoft.org/schema/mule/json http://www.mulesoft.org/schema/mule/json/current/mule-json.xsd 
http://www.mulesoft.org/schema/mule/vm http://www.mulesoft.org/schema/mule/vm/current/mule-vm.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/https http://www.mulesoft.org/schema/mule/https/current/mule-https.xsd 
http://www.mulesoft.org/schema/mule/file http://www.mulesoft.org/schema/mule/file/current/mule-file.xsd 
http://www.mulesoft.org/schema/mule/scripting http://www.mulesoft.org/schema/mule/scripting/current/mule-scripting.xsd 
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 "> 
    <configuration doc:name="Configuration"> 
     <expression-language> 
      <import class="org.mule.util.StringUtils" /> 
     </expression-language> 
    </configuration> 
    <flow name="BingQuery" doc:name="BingQuery"> 
     <http:inbound-endpoint exchange-pattern="one-way" host="localhost" port="8082" doc:name="HTTP" /> 
     <set-variable variableName="query" doc:name="Variable" value="#[header:INBOUND:query]"/> 
     <set-variable variableName="numResults" doc:name="Variable" value="#[header:INBOUND:top]"/> 
     <set-variable variableName="offsetResults" doc:name="Variable" value="#[header:INBOUND:offset]"/> 
     <scripting:component doc:name="Groovy"> 
      <scripting:script engine="Groovy"> 
       <scripting:text><![CDATA[def query = message.getInvocationProperty("query") 
       def numResults = message.getInvocationProperty("numResults") 
       def offsetResults = message.getInvocationProperty("offsetResults") 
       def path = "Data.ashx/Bing/Search/v1/Web?Query=" + "$query" + "&WebFileType=%27PDF%27&\$top=" + "$numResults" + "&\$skip=" + "$offsetResults" + "&\$format=Json" 
        println "$path" 
        message.setProperty("pathVar","$path") 
        message.setProperty("APIIdentifier","*****") 
        return null;]]></scripting:text> 
      </scripting:script> 
     </scripting:component> 
     <https:outbound-endpoint exchange-pattern="request-response" 
      host="api.datamarket.azure.com" port="443" path="#[header:OUTBOUND:pathVar]" 
      user="#[header:OUTBOUND:APIIdentifier]" password="#[header:OUTBOUND:APIIdentifier]" 
      doc:name="Bing" /> 
     <json:json-to-object-transformer 
      returnClass="java.util.Map" doc:name="JSON to Object" /> 
     <expression-transformer expression="#[message.payload.d.results]" 
      doc:name="Expression" /> 
     <collection-splitter doc:name="Collection Splitter" /> 
     <vm:outbound-endpoint exchange-pattern="one-way" 
      path="fileWriter" doc:name="VM" /> 
    </flow> 
    <flow name="RestProcessor" doc:name="RestProcessor"> 
     <vm:inbound-endpoint exchange-pattern="one-way" 
      path="fileWriter" doc:name="VM" /> 
     <set-variable variableName="fileName" value="#[message.payload.ID].pdf" 
      doc:name="Variable" /> 
     <http:rest-service-component 
      serviceUrl="#[joinChar=message.payload.Url.contains('?')?'&amp;':'?' ; StringUtils.join(new String[]{message.payload.Url,(String)joinChar,'followRedirects=true'})]" 
      httpMethod="GET"> 
      <http:error-filter> 
       <expression-filter expression="#[Integer.valueOf(message.inboundProperties['http.status']) &gt;= 400]"></expression-filter> 
      </http:error-filter> 
     </http:rest-service-component> 
     <file:outbound-endpoint path="/home/administrator/Documents" 
      outputPattern="#[flowVars.fileName]" responseTimeout="10000" 
      mimeType="application/pdf" doc:name="File" /> 
    </flow> 
</mule> 

回答

1

这里是MEL改写流的开始(工作对我来说,虽然我对测试端点不是兵测试)。

请注意,我还设置为GET出站HTTPS端点的方法:

<flow name="BingQuery"> 
    <http:inbound-endpoint exchange-pattern="one-way" 
     host="localhost" port="8082" /> 
    <set-variable variableName="query" 
     value="#[message.inboundProperties.query]" /> 
    <set-variable variableName="numResults" 
     value="#[message.inboundProperties.top]" /> 
    <set-variable variableName="offsetResults" 
     value="#[message.inboundProperties.offset]" /> 
    <expression-component> 
     flowVars['bingQuery'] = 
      'Data.ashx/Bing/Search/v1/Web?Query=' + query 
      + '&amp;WebFileType=%27PDF%27&amp;$top=' + numResults 
      + '&amp;$skip=' + offsetResults 
      + '&amp;$format=Json'; 
     payload = null; 
    </expression-component> 
    <logger level="ERROR" message="#[bingQuery]" /> 
    <http:outbound-endpoint exchange-pattern="request-response" 
     method="GET" 
     host="api.datamarket.azure.com" port="443" path="#[bingQuery]" 
     user="*****" password="******" /> 

如果querynumResultsoffsetResults变量没有在流动其他地方使用的话,建议内联用来创建表达式他们正确的在expression-component

+0

我们记录了#[有效载荷],它正在踢出正确的路径字符串,但由于某种原因,即使将方法设置为GET,我们仍然得到相同的错误。如果我们只是放入路径的字符串文字,它的工作原理没有错误。 – Thaneofife

+0

提供第二个选项... –

+0

我刚刚更新了我的脚本,并得到相同的错误。日志记录#[header:OUTBOUND:pathVar]给出与之前相同的字符串,但路径失败。 – Thaneofife