简体   繁体   English

如何在wso2 esb中传递json体中的&符号

[英]How to pass ampersand in json body in wso2 esb

I have an issue when passing ampersand inside a JSON body value when calling a REST API on WSO2 esb , it gives an exception. WSO2 esb上调用REST API时,在JSON体值内传递&符时出现问题,它会出现异常。 But I need to pass this '&' value to the backend via esb and not as & 但是我需要通过esb将这个“&”值传递给后端而不是& .

I tried to send via the following ways, but didn't get any success. 我尝试通过以下方式发送,但没有取得任何成功。

  • &
  • url encoded value 网址编码值
  • hexadecimal value 十六进制值

Please help me to solve this issue. 请帮我解决这个问题。

This is the exception which I got. 这是我得到的例外。

[2016-08-10 13:52:26,538] ERROR -  The script engine returned an error executing the inlined js script function mediate {org.apache.synapse.mediators.bsf.ScriptMediator}
com.sun.phobos.script.util.ExtendedScriptException: org.mozilla.javascript.EcmaError: TypeError: error: Unexpected character encountered (lex state 3): ' ' (<Unknown Source>#1) in <Unknown Source> at line number 1
        at com.sun.phobos.script.javascript.RhinoCompiledScript.eval(RhinoCompiledScript.java:68)
        at javax.script.CompiledScript.eval(CompiledScript.java:92)
        at org.apache.synapse.mediators.bsf.ScriptMediator.mediateForInlineScript(ScriptMediator.java:291)
        at org.apache.synapse.mediators.bsf.ScriptMediator.invokeScript(ScriptMediator.java:235)
        at org.apache.synapse.mediators.bsf.ScriptMediator.mediate(ScriptMediator.java:203)
        at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:77)
        at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:47)
        at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:131)
        at org.apache.synapse.rest.Resource.process(Resource.java:297)
        at org.apache.synapse.rest.API.process(API.java:341)
        at org.apache.synapse.rest.RESTRequestHandler.dispatchToAPI(RESTRequestHandler.java:76)
        at org.apache.synapse.rest.RESTRequestHandler.process(RESTRequestHandler.java:63)
        at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectMessage(Axis2SynapseEnvironment.java:220)
        at org.apache.synapse.core.axis2.SynapseMessageReceiver.receive(SynapseMessageReceiver.java:83)
        at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180)
        at org.apache.synapse.transport.passthru.ServerWorker.processNonEntityEnclosingRESTHandler(ServerWorker.java:344)
        at org.apache.synapse.transport.passthru.ServerWorker.processEntityEnclosingRequest(ServerWorker.java:385)
        at org.apache.synapse.transport.passthru.ServerWorker.run(ServerWorker.java:183)
        at org.apache.axis2.transport.base.threads.NativeWorkerPool$1.run(NativeWorkerPool.java:172)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:745)
Caused by: org.mozilla.javascript.EcmaError: TypeError: error: Unexpected character encountered (lex state 3): ' ' (<Unknown Source>#1)
        at org.mozilla.javascript.ScriptRuntime.constructError(ScriptRuntime.java:3350)
        at org.mozilla.javascript.ScriptRuntime.constructError(ScriptRuntime.java:3340)
        at org.mozilla.javascript.ScriptRuntime.typeError(ScriptRuntime.java:3356)
        at org.mozilla.javascript.xml.impl.xmlbeans.XML.createFromJS(XML.java:388)
        at org.mozilla.javascript.xml.impl.xmlbeans.XML.jsConstructor(XML.java:3065)
        at org.mozilla.javascript.xml.impl.xmlbeans.XMLObjectImpl.execIdCall(XMLObjectImpl.java:549)
        at org.mozilla.javascript.IdFunctionObject.call(IdFunctionObject.java:127)
        at org.mozilla.javascript.BaseFunction.construct(BaseFunction.java:313)
        at org.mozilla.javascript.ScriptRuntime.newObject(ScriptRuntime.java:2132)
        at org.mozilla.javascript.gen.c92._c0(<Unknown Source>:1)
        at org.mozilla.javascript.gen.c92.call(<Unknown Source>)
        at org.mozilla.javascript.ContextFactory.doTopCall(ContextFactory.java:393)
        at org.mozilla.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:2834)
        at org.mozilla.javascript.gen.c92.call(<Unknown Source>)
        at org.mozilla.javascript.gen.c92.exec(<Unknown Source>)
        at com.sun.phobos.script.javascript.RhinoCompiledScript.eval(RhinoCompiledScript.java:55)
        ... 21 more
[2016-08-10 13:52:26,540]  WARN -  Executing fault handler due to exception encountered {org.apache.synapse.core.axis2.SynapseMessageReceiver}
[2016-08-10 13:52:26,540]  WARN -  ERROR_CODE : 0 {org.apache.synapse.FaultHandler}
[2016-08-10 13:52:26,541]  WARN -  ERROR_MESSAGE : The script engine returned an error executing the inlined js script function mediate {org.apache.synapse.FaultHandler}
[2016-08-10 13:52:26,541]  WARN -  ERROR_DETAIL : org.apache.synapse.SynapseException: The script engine returned an error executing the inlined js script function mediate
        at org.apache.synapse.mediators.AbstractMediator.handleException(AbstractMediator.java:313)
        at org.apache.synapse.mediators.bsf.ScriptMediator.invokeScript(ScriptMediator.java:241)
        at org.apache.synapse.mediators.bsf.ScriptMediator.mediate(ScriptMediator.java:203)
        at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:77)
        at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:47)
        at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:131)
        at org.apache.synapse.rest.Resource.process(Resource.java:297)
        at org.apache.synapse.rest.API.process(API.java:341)
        at org.apache.synapse.rest.RESTRequestHandler.dispatchToAPI(RESTRequestHandler.java:76)
        at org.apache.synapse.rest.RESTRequestHandler.process(RESTRequestHandler.java:63)
        at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectMessage(Axis2SynapseEnvironment.java:220)
        at org.apache.synapse.core.axis2.SynapseMessageReceiver.receive(SynapseMessageReceiver.java:83)
        at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180)
        at org.apache.synapse.transport.passthru.ServerWorker.processNonEntityEnclosingRESTHandler(ServerWorker.java:344)
        at org.apache.synapse.transport.passthru.ServerWorker.processEntityEnclosingRequest(ServerWorker.java:385)
        at org.apache.synapse.transport.passthru.ServerWorker.run(ServerWorker.java:183)
        at org.apache.axis2.transport.base.threads.NativeWorkerPool$1.run(NativeWorkerPool.java:172)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:745)
Caused by: com.sun.phobos.script.util.ExtendedScriptException: org.mozilla.javascript.EcmaError: TypeError: error: Unexpected character encountered (lex state 3): ' ' (<Unknown Source>#1) in <Unknown Source> at line number 1
        at com.sun.phobos.script.javascript.RhinoCompiledScript.eval(RhinoCompiledScript.java:68)
        at javax.script.CompiledScript.eval(CompiledScript.java:92)
        at org.apache.synapse.mediators.bsf.ScriptMediator.mediateForInlineScript(ScriptMediator.java:291)
        at org.apache.synapse.mediators.bsf.ScriptMediator.invokeScript(ScriptMediator.java:235)
        ... 18 more
Caused by: org.mozilla.javascript.EcmaError: TypeError: error: Unexpected character encountered (lex state 3): ' ' (<Unknown Source>#1)
        at org.mozilla.javascript.ScriptRuntime.constructError(ScriptRuntime.java:3350)
        at org.mozilla.javascript.ScriptRuntime.constructError(ScriptRuntime.java:3340)
        at org.mozilla.javascript.ScriptRuntime.typeError(ScriptRuntime.java:3356)
        at org.mozilla.javascript.xml.impl.xmlbeans.XML.createFromJS(XML.java:388)
        at org.mozilla.javascript.xml.impl.xmlbeans.XML.jsConstructor(XML.java:3065)
        at org.mozilla.javascript.xml.impl.xmlbeans.XMLObjectImpl.execIdCall(XMLObjectImpl.java:549)
        at org.mozilla.javascript.IdFunctionObject.call(IdFunctionObject.java:127)
        at org.mozilla.javascript.BaseFunction.construct(BaseFunction.java:313)
        at org.mozilla.javascript.ScriptRuntime.newObject(ScriptRuntime.java:2132)
        at org.mozilla.javascript.gen.c92._c0(<Unknown Source>:1)
        at org.mozilla.javascript.gen.c92.call(<Unknown Source>)
        at org.mozilla.javascript.ContextFactory.doTopCall(ContextFactory.java:393)
        at org.mozilla.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:2834)
        at org.mozilla.javascript.gen.c92.call(<Unknown Source>)
        at org.mozilla.javascript.gen.c92.exec(<Unknown Source>)
        at com.sun.phobos.script.javascript.RhinoCompiledScript.eval(RhinoCompiledScript.java:55)
        ... 21 more

I have tried same thing with wire logs enabled and it worked for me without any changes. 我已经尝试使用有线日志同样的东西,它没有任何变化对我有用。 What is the ESB version you tried. 您尝试过的ESB版本是什么? If you enabled wire logs you will what comes and what goes out as follows. 如果您启用了线路日志,那么您将会发生什么以及如下所示的内容。 I added & symbol to body parameter. 我在body参数中添加了&符号。

[2016-08-10 11:11:05,643] DEBUG - wire >> "POST /pizzashack/1.0.0/order HTTP/1.1[\r][\n]"
[2016-08-10 11:11:05,643] DEBUG - wire >> "Host: 172.17.0.1:8243[\r][\n]"
[2016-08-10 11:11:05,643] DEBUG - wire >> "User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:46.0) Gecko/20100101 Firefox/46.0[\r][\n]"
[2016-08-10 11:11:05,643] DEBUG - wire >> "Accept: application/json[\r][\n]"
[2016-08-10 11:11:05,643] DEBUG - wire >> "Accept-Language: en-US,en;q=0.5[\r][\n]"
[2016-08-10 11:11:05,643] DEBUG - wire >> "Accept-Encoding: gzip, deflate, br[\r][\n]"
[2016-08-10 11:11:05,643] DEBUG - wire >> "Content-Type: application/json[\r][\n]"
[2016-08-10 11:11:05,643] DEBUG - wire >> "Authorization: Bearer 0227aad0-bc8c-3a4a-b010-fadb7582b488[\r][\n]"
[2016-08-10 11:11:05,644] DEBUG - wire >> "Referer: https://127.0.0.1:9443/store/apis/info?name=PizzaShackAPI&version=1.0.0&provider=admin[\r][\n]"
[2016-08-10 11:11:05,644] DEBUG - wire >> "Content-Length: 169[\r][\n]"
[2016-08-10 11:11:05,644] DEBUG - wire >> "origin: https://127.0.0.1:9443[\r][\n]"
[2016-08-10 11:11:05,644] DEBUG - wire >> "Connection: keep-alive[\r][\n]"
[2016-08-10 11:11:05,644] DEBUG - wire >> "[\r][\n]"
[2016-08-10 11:11:05,644] DEBUG - wire >> "{[\n]"
[2016-08-10 11:11:05,644] DEBUG - wire >> "  "customerName": "string&test",[\n]"
[2016-08-10 11:11:05,644] DEBUG - wire >> "  "delivered": true,[\n]"
[2016-08-10 11:11:05,644] DEBUG - wire >> "  "address": "string",[\n]"
[2016-08-10 11:11:05,644] DEBUG - wire >> "  "pizzaType": "string",[\n]"
[2016-08-10 11:11:05,644] DEBUG - wire >> "  "creditCardNumber": "string",[\n]"
[2016-08-10 11:11:05,644] DEBUG - wire >> "  "quantity": 0,[\n]"
[2016-08-10 11:11:05,644] DEBUG - wire >> "  "orderId": 0[\n]"
[2016-08-10 11:11:05,644] DEBUG - wire >> "}"
[2016-08-10 11:11:05,647] DEBUG - wire << "POST /am/sample/pizzashack/v1/api/order HTTP/1.1[\r][\n]"
[2016-08-10 11:11:05,647] DEBUG - wire << "Accept: application/json[\r][\n]"
[2016-08-10 11:11:05,647] DEBUG - wire << "origin: https://127.0.0.1:9443[\r][\n]"
[2016-08-10 11:11:05,647] DEBUG - wire << "Referer: https://127.0.0.1:9443/store/apis/info?name=PizzaShackAPI&version=1.0.0&provider=admin[\r][\n]"
[2016-08-10 11:11:05,647] DEBUG - wire << "Accept-Encoding: gzip, deflate, br[\r][\n]"
[2016-08-10 11:11:05,647] DEBUG - wire << "Accept-Language: en-US,en;q=0.5[\r][\n]"
[2016-08-10 11:11:05,647] DEBUG - wire << "Content-Type: application/json; charset=UTF-8[\r][\n]"
[2016-08-10 11:11:05,647] DEBUG - wire << "Transfer-Encoding: chunked[\r][\n]"
[2016-08-10 11:11:05,647] DEBUG - wire << "Host: localhost:9443[\r][\n]"
[2016-08-10 11:11:05,647] DEBUG - wire << "Connection: Keep-Alive[\r][\n]"
[2016-08-10 11:11:05,647] DEBUG - wire << "User-Agent: Synapse-PT-HttpComponents-NIO[\r][\n]"
[2016-08-10 11:11:05,647] DEBUG - wire << "[\r][\n]"
[2016-08-10 11:11:05,647] DEBUG - wire << "a9[\r][\n]"
[2016-08-10 11:11:05,647] DEBUG - wire << "{[\n]"
[2016-08-10 11:11:05,647] DEBUG - wire << "  "customerName": "string&test",[\n]"
[2016-08-10 11:11:05,647] DEBUG - wire << "  "delivered": true,[\n]"
[2016-08-10 11:11:05,647] DEBUG - wire << "  "address": "string",[\n]"
[2016-08-10 11:11:05,647] DEBUG - wire << "  "pizzaType": "string",[\n]"
[2016-08-10 11:11:05,647] DEBUG - wire << "  "creditCardNumber": "string",[\n]"
[2016-08-10 11:11:05,647] DEBUG - wire << "  "quantity": 0,[\n]"
[2016-08-10 11:11:05,647] DEBUG - wire << "  "orderId": 0[\n]"
[2016-08-10 11:11:05,647] DEBUG - wire << "}[\r][\n]"
[2016-08-10 11:11:05,647] DEBUG - wire << "0[\r][\n]"
[2016-08-10 11:11:05,648] DEBUG - wire << "[\r][\n]"

I tried same in ESB 4.8.1 as well. 我也在ESB 4.8.1中尝试过相同的操作。 Since i saw java script errors in your error log i added java script mediator as well. 因为我在错误日志中看到了java脚本错误,所以我也添加了java脚本调解器。 Please see sample API below. 请参阅下面的示例API。

   <api name="TestAPI" context="/test">
      <resource methods="POST" url-mapping="/status" faultSequence="fault">
         <inSequence>
            <script language="js">var symbol = mc.getPayloadXML()..*::password.toString();
               mc.setPayloadXML(
                  &lt;m:getQuote xmlns:m="http://services.samples/xsd"&gt;
                     &lt;m:request&gt;
                        &lt;m:symbol&gt;{symbol}&lt;/m:symbol&gt;
                     &lt;/m:request&gt;
                  &lt;/m:getQuote&gt;);</script>
            <send>
               <endpoint name="test-I_APIproductionEndpoint_0">
                  <http uri-template="http://127.0.0.1:8888/"/>
               </endpoint>
            </send>
         </inSequence>
         <outSequence>
            <send/>
         </outSequence>
      </resource>
   </api>

Then i send request as follows. 然后我发送请求如下。

curl -v -X POST -H "Content-Type: application/json" -d '{"username":"xyz","password":"xyz & abc"}' http://127.0.0.1:8280/test/status

I can see my values pass to back end properly. 我可以看到我的值正确传递到后端。 Just to verify i added TCPMon between ESB and back end to verify out going message. 只是为了验证我在ESB和后端之间添加了TCPMon来验证输出消息。 Its going back with & sign. 它带着&符号返回。 Wire logs are here and TCPMon output also attached. Wire日志在此处,并且还附加了TCPMon输出。

[2016-08-10 14:30:21,236] DEBUG - wire >> "POST /test/status HTTP/1.1[\r][\n]"
[2016-08-10 14:30:21,236] DEBUG - wire >> "Host: 127.0.0.1:8280[\r][\n]"
[2016-08-10 14:30:21,236] DEBUG - wire >> "User-Agent: curl/7.43.0[\r][\n]"
[2016-08-10 14:30:21,236] DEBUG - wire >> "Accept: */*[\r][\n]"
[2016-08-10 14:30:21,236] DEBUG - wire >> "Content-Type: application/json[\r][\n]"
[2016-08-10 14:30:21,236] DEBUG - wire >> "Content-Length: 41[\r][\n]"
[2016-08-10 14:30:21,237] DEBUG - wire >> "[\r][\n]"
[2016-08-10 14:30:21,237] DEBUG - wire >> "{"username":"xyz","password":"xyz & abc"}"
[2016-08-10 14:30:21,245] DEBUG - wire << "POST /status HTTP/1.1[\r][\n]"
[2016-08-10 14:30:21,245] DEBUG - wire << "Content-Type: application/json[\r][\n]"
[2016-08-10 14:30:21,246] DEBUG - wire << "Accept: */*[\r][\n]"
[2016-08-10 14:30:21,246] DEBUG - wire << "Transfer-Encoding: chunked[\r][\n]"
[2016-08-10 14:30:21,246] DEBUG - wire << "Host: 127.0.0.1:8888[\r][\n]"
[2016-08-10 14:30:21,246] DEBUG - wire << "Connection: Keep-Alive[\r][\n]"
[2016-08-10 14:30:21,246] DEBUG - wire << "User-Agent: Synapse-PT-HttpComponents-NIO[\r][\n]"
[2016-08-10 14:30:21,246] DEBUG - wire << "[\r][\n]"
[2016-08-10 14:30:21,246] DEBUG - wire << "2f[\r][\n]"
[2016-08-10 14:30:21,247] DEBUG - wire << "{"getQuote":{"request":{"symbol":"xyz & abc"}}}[\r][\n]"
[2016-08-10 14:30:21,247] DEBUG - wire << "0[\r][\n]"
[2016-08-10 14:30:21,247] DEBUG - wire << "[\r][\n]"

在此输入图像描述

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM