2016-04-15 8 views
0

私は、特別なフィールドに含まれるapi送信パラメータからサンプルを持ち、api invoke proxyサービスを使用しています。プロキシバックグラウンド解析エラーです。esb wso2 4.8.1プロキシサービス分析soap xmlエラー、xmlに特殊な文字が含まれています

サンプルAPIコード:

<api xmlns="http://ws.apache.org/ns/synapse" name="eva_data" context="/kdmService/rest/2.0/evaluation/data/current/kksCodes"> 
 
    <resource methods="POST"> 
 
     <inSequence> 
 
     <log level="full"> 
 
      <property name="kks=============" expression="$body/mediate/*[substring(name(),1,8)='kksCodes']"></property> 
 
     </log> 
 
     <property name="kks" expression="$body/mediate/*[substring(name(),1,8)='kksCodes']"></property> 
 
     <header name="kksCodes" scope="transport" expression="get-property('kks')"></header> 
 
     <call> 
 
      <endpoint> 
 
       <address uri="http://127.0.0.1:8280/services/searchMultiEvaData" format="pox"></address> 
 
      </endpoint> 
 
     </call> 
 
     <respond></respond> 
 
     </inSequence> 
 
    </resource> 
 
</api>

要求アドレス:

http://localhost:8080/kdmService/rest/2.0/evaluation/data/current/kksCodes 

リクエストパラメータ:

kksCodes[]="EB001HP1MEJ01ME029BL01J1CB001BB01" 

サンプルプロキシコード:APIは、プロキシサービス、バックグラウンド誤差を呼び出す

<?xml version="1.0" encoding="UTF-8"?> 
 
<proxy xmlns="http://ws.apache.org/ns/synapse" 
 
     name="searchMultiEvaData" 
 
     transports="https,http,local" 
 
     statistics="disable" 
 
     trace="disable" 
 
     startOnLoad="true"> 
 
    <target> 
 
     <inSequence> 
 
     <log level="full"> 
 
      <property name="kksCode" expression="get-property('transport','kksCodes')"/> 
 
     </log> 
 
     <property name="uri.var.kksCodes" 
 
        expression="get-property('transport','kksCodes')"/> 
 
     <property name="uri.var.isPathVariable" value="false"/> 
 
     <call> 
 
      <endpoint key="searchEvaKksAddressPoint"/> 
 
     </call> 
 
     <enrich> 
 
      <source type="body" clone="true"/> 
 
      <target type="property" property="_payload"/> 
 
     </enrich> 
 
     <log> 
 
      <property name="payload1" expression="get-property('_payload')"/> 
 
     </log> 
 
     <property name="payload" expression="get-property('_payload')"/> 
 
     </inSequence> 
 
     <outSequence> 
 
     </outSequence> 
 
    </target> 
 
    <description/> 
 
</proxy>

。コンソール出力誤差:

[2016-04-15 11:34:47,144] INFO - LogMediator To: /kdmService/rest/2.0/evaluation/data/current/kksC 
 
odes, MessageID: urn:uuid:950bf641-c481-4527-8266-e535e906d6bf, Direction: request, kks============ 
 
= = EB001HP1MEJ01ME029BL01J1CB001BB01, Envelope: <?xml version="1.0" encoding="utf-8"?><soapenv:Env 
 
elope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"><soapenv:Body><mediate><kksCodes%5B%5 
 
D>EB001HP1MEJ01ME029BL01J1CB001BB01</kksCodes%5B%5D></mediate></soapenv:Body></soapenv:Envelope> 
 
[2016-04-15 11:34:47,151] ERROR - NativeWorkerPool Uncaught exception 
 
org.apache.axiom.om.OMException: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,19 
 
] 
 
Message: 元素类型 "kksCodes" 必须后跟属性规范 ">" 或 "/>"。 
 
\t at org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:296) 
 
\t at org.apache.axiom.om.impl.llom.OMElementImpl.buildNext(OMElementImpl.java:653) 
 
\t at org.apache.axiom.om.impl.llom.OMElementImpl.getFirstOMChild(OMElementImpl.java:670)

パラメータxml形式:

<?xml version="1.0" encoding="utf-8"?> 
 
<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"> 
 
    \t \t <soapenv:Body> 
 
    \t \t \t <mediate> 
 
    \t \t \t \t <kksCodes[]>EB001HP1MEJ01ME029BL01J1CB001BB01</kksCodes[]> 
 
    \t \t \t </mediate> 
 
    \t \t </soapenv:Body> 
 
</soapenv:Envelope>

私が思うには、kksCodes []解析エラーですが、私は解決するかわかりませんそれ。助けて!ありがとう!

+0

nobady know that? – Pourquoi

答えて

0

<kksCodes[]>要素は、次のようにCDATAブロック内に囲むことができます。

<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"> 
<soapenv:Body> 
    <mediate> 
    <![CDATA[ 
    <kksCodes[]>EB001HP1MEJ01ME029BL01J1CB001BB01</kksCodes[]> 
    ]]> 
    </mediate> 
</soapenv:Body> 
</soapenv:Envelope> 

CDATAブロック内の値が適切なXMLではないので、あなたはすぐにXPath式を使用してkksCodesを抽出することができません。

これを抽出するには、WSO2 ESBのスクリプトメディエーターを使用して文字列操作を実行する必要があります。 [1]

コードが抽出されたら、スクリプトメディエータ自体を使用してプロパティとして設定できます。 その後、kksCodesをトランスポートヘッダーとして設定し、プロキシサービスに渡すことができます。

0

String manipulation in WSO2 ESB using the script mediatorこのブログの投稿に従うことで簡単に行うことができます。独自のカスタムメディエーターを書く可能性は常にあります。これはあなたにほぼ完全な制御を与えるJavaプログラムですが、おそらく仕事を終わらせる簡単な方法があります。このブログの投稿コード例でそれを行う方法。

関連する問題