【问题标题】:WSO2ESB Rest API error: Invalid UTF-8 middle byte 0x6f (at char #143, byte #127)WSO2ESB Rest API 错误:无效的 UTF-8 中间字节 0x6f(在字符 #143,字节 #127)
【发布时间】:2017-07-07 21:01:49
【问题描述】:

我在 wso2esb 5.0.0 中开发了一个 REST API,当客户端发送包含 ã、ç 或 é 的请求时遇到一些问题,例如 inSequence 上的第一个中介 管道,引发关于Invalid UTF-8 middle byte 的错误。

当我们将 HTTP 标头中的消息字符集强制为 ISO-8859-1 时,可以正常工作。但我们需要使用 UTF-8。

有人已经面临这个问题并且可以帮助我吗?

跟随堆栈跟踪关闭错误:

TID[-1234] [ESB] [2017-07-04 15:12:26,738] ERROR {API_LOGGER.ResourceAPI} - Could not build full log message: [com.ctc.wstx.exc.WstxLazyException] Invalid UTF-8 middle byte 0x6f (at char #143, byte #127) com.ctc.wstx.exc.WstxLazyException.throwLazily(WstxLazyException.java:45) com.ctc.wstx.sr.StreamScanner.throwLazyError(StreamScanner.java:720) com.ctc.wstx.sr.BasicStreamReader.safeFinishToken(BasicStreamReader.java:3677) com.ctc.wstx.sr.BasicStreamReader.getText(BasicStreamReader.java:858) org.apache.axiom.util.stax.wrapper.XMLStreamReaderWrapper.getText(XMLStreamReaderWrapper.java:164) org.apache.axiom.om.impl.builder.StAXBuilder.createOMText(StAXBuilder.java:289) org.apache.axiom.om.impl.builder.StAXBuilder.createOMText(StAXBuilder.java:250) org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:252) org.apache.axiom.om.impl.llom.OMElementImpl.buildNext(OMElementImpl.java:653) org.apache.axiom.om.impl.llom.OMElementImpl.getFirstOMChild(OMElementImpl.java:670) org.apache.axiom.om.impl.llom.OMElementImpl.getChildren(OMElementImpl.java:352) org.apache.axiom.om.impl.util.OMSerializerUtil.serializeChildren(OMSerializerUtil.java:553) org.apache.axiom.om.impl.llom.OMElementImpl.internalSerialize(OMElementImpl.java:875) org.apache.axiom.om.impl.util.OMSerializerUtil.serializeChildren(OMSerializerUtil.java:555) org.apache.axiom.om.impl.llom.OMElementImpl.internalSerialize(OMElementImpl.java:875) org.apache.axiom.om.impl.util.OMSerializerUtil.serializeChildren(OMSerializerUtil.java:555) org.apache.axiom.om.impl.llom.OMElementImpl.internalSerialize(OMElementImpl.java:875) org.apache.axiom.soap.impl.llom.SOAPEnvelopeImpl.internalSerialize(SOAPEnvelopeImpl.java:230) org.apache.axiom.om.impl.llom.OMSerializableImpl.serialize(OMSerializableImpl.java:125) org.apache.axiom.om.impl.llom.OMSerializableImpl.serialize(OMSerializableImpl.java:113) org.apache.axiom.om.impl.llom.OMElementImpl.toString(OMElementImpl.java:988) java.lang.String.valueOf(String.java:2994) java.lang.StringBuffer.append(StringBuffer.java:265) org.apache.synapse.mediators.builtin.LogMediator.getFullLogMessage(LogMediator.java:203) org.apache.synapse.mediators.builtin.LogMediator.getLogMessage(LogMediator.java:138) org.apache.synapse.mediators.builtin.LogMediator.mediate(LogMediator.java:101) org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:97) org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:59) org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:158) org.apache.synapse.rest.Resource.process(Resource.java:343) org.apache.synapse.rest.API.process(API.java:399) org.apache.synapse.rest.RESTRequestHandler.apiProcess(RESTRequestHandler.java:123) org.apache.synapse.rest.RESTRequestHandler.dispatchToAPI(RESTRequestHandler.java:101) org.apache.synapse.rest.RESTRequestHandler.process(RESTRequestHandler.java:69) org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectMessage(Axis2SynapseEnvironment.java:304) org.apache.synapse.core.axis2.SynapseMessageReceiver.receive(SynapseMessageReceiver.java:75) org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180) org.apache.axis2.transport.http.util.RESTUtil.invokeAxisEngine(RESTUtil.java:144) org.apache.axis2.transport.http.util.RESTUtil.processXMLRequest(RESTUtil.java:89) org.apache.synapse.transport.nhttp.util.RESTUtil.processPOSTRequest(RESTUtil.java:213) org.apache.synapse.transport.nhttp.ServerWorker.processEntityEnclosingMethod(ServerWorker.java:468) org.apache.synapse.transport.nhttp.ServerWorker.run(ServerWorker.java:291) org.apache.axis2.transport.base.threads.NativeWorkerPool$1.run(NativeWorkerPool.java:172) java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) java.lang.Thread.run(Thread.java:745) 

注意:当我们使用普通的 SOAP 代理和消息时工作正常。字符集没问题。

[编辑]

注意:就像@weibeld 所说,我的语言是葡萄牙语。

我的 REST API 有一个使用 POST 方法的资源,我正在向服务器发送以下请求:

POST http://myHost:8280/api/v1/myResource HTTP/1.1
Accept-Encoding: gzip,deflate
Content-Type: application/json;charset=utf-8
Content-Length: 741
Host: myHost:8280
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)

 {
"customerName": "CONSULTORIA EMPRESARIAL EIRELI - ME",
"serviceId": "05948517",
"productName": "Banda Larga Expansão Sul",
"localityCode": "51000",
"status": "OCUPADO",
"isChangeOfAddress": "FALSO",
"serial": "0047848517",
"vlanType": "1Q",
"ont_id": "0047848517",
"modelo_ont": "ZHONE-2425",
"accessType": "GPON",
"streetCode": "4535",
"neighbourhood": "NEIGHBOURHOOD",
"streetNumber": "4428",
"complement1": "2"

}

注意:在这一行 "productName": "Banda Larga Expansão Sul", 我有一个 ão。

总结一下,我正在发送一个带有 application/json;charset=utf-8 的 POST 并且 wso2esb 引发了一个关于 ão 的错误,当我发送了一个 ISO-8859-1 工作正常。 (当我使用带有 utf-8 的肥皂时可以正常工作)。

【问题讨论】:

标签: rest api character-encoding wso2 wso2esb


【解决方案1】:

您的客户端发送到服务器的 HTTP 请求似乎使用 ISO-8859-1 编码,而不是使用 UTF-8。

然后服务器尝试使用 UTF-8 解码此请求。这适用于所有 ASCII 字符。但是,在某些时候,服务器会遇到您报告的非 ASCII 字符之一的 ISO 8859-1 代码:

  • ã ==> 0xE3 = 11100011
  • ç ==> 0xE7 = 11100111
  • é ==> 0xE9 = 11101001

(将上面的列表读作:[字符] ==> [ISO 8859-1 十六进制代码。] = [ISO 8859-1 代码箱。])

现在 UTF-8 将此字节解释为 3 字节 UTF-8 代码的前导字节,因为它以 1110 开头(请参阅here)。因此,UTF-8 期望下一个字节是 UTF-8 连续字节,它必须以 10 开头。但是,下一个字节是 0x6f,即 ASCII 字符 o 的 ISO 8859-1 代码,即 01101111 在二进制,即不以 10 开头。

因此出现错误消息Invalid UTF-8 middle byte 0x6f。

所以,我猜您的请求包含子字符串 ão、ço 或 éo,如果您的语言是葡萄牙语,这很可能。

总结:您需要确保客户端使用 UTF-8 编码请求。我不知道您是如何创建请求的,但应该可以在您使用的任何函数中设置编码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多