DataPower报incomplete markup错误,Non-xml类型MPG服务排障求助
解决DataPower MPG服务Non-xml类型下JSON请求错误及日志记录问题
一、错误根源:JSON格式不完整
你的请求JSON存在语法错误,缺少两个闭合的大括号:
原始错误JSON:
{ "meta": { "totalPages": 13 }
修正后正确格式:
{ "meta": { "totalPages": 13 } }
这个格式错误是触发"incomplete markup or missing document element"错误的直接原因——即使服务设置为Non-xml类型,DataPower在处理JSON时仍会做基础语法校验。
二、不修改服务类型,在错误规则中获取JSON值的方案
由于服务请求/响应类型是Non-xml,DataPower不会自动将请求内容解析为可被XSLT直接处理的DOM节点,需要通过DataPower扩展函数手动读取并解析原始请求:
实现步骤
- 在错误规则的XSLT中,使用
dp:request-content()获取原始请求的字符串内容; - 用
json:parse()函数将字符串解析为JSONX格式的XML节点(DataPower专属的JSON转XML格式); - 针对解析后的节点提取所需字段,同时处理解析失败的异常情况;
- 记录日志或返回自定义错误响应。
示例XSLT代码
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:dp="http://www.datapower.com/extensions" xmlns:json="http://www.ibm.com/xmlns/prod/2009/jsonx" extension-element-prefixes="dp json"> <xsl:template match="/"> <!-- 获取原始请求内容 --> <xsl:variable name="rawRequest" select="dp:request-content()"/> <!-- 尝试解析JSON,捕获解析异常 --> <xsl:variable name="jsonData"> <xsl:try> <json:parse select="$rawRequest"/> <xsl:catch> <dp:log-message level="error">JSON解析失败:<xsl:value-of select="$dp:exception-message"/></dp:log-message> </xsl:catch> </xsl:try> </xsl:variable> <!-- 提取并记录JSON中的totalPages字段 --> <xsl:if test="$jsonData/json:object/json:object[@name='meta']/json:number[@name='totalPages']"> <dp:log-message level="error"> 请求格式错误,请求中的totalPages值:<xsl:value-of select="$jsonData/json:object/json:object[@name='meta']/json:number[@name='totalPages']"/> </dp:log-message> </xsl:if> <!-- 返回自定义错误响应 --> <dp:response-header name="Content-Type" value="application/json"/> <xsl:text>{"code":"INVALID_REQUEST","message":"请求格式不完整,请检查JSON语法"}</xsl:text> </xsl:template> </xsl:stylesheet>
关键说明
- 需确保DataPower固件版本在v7.0及以上,该版本开始支持
json:parse()函数; dp:request-content()直接读取请求的原始字节流,无需依赖服务的请求类型设置;- 异常处理部分避免因JSON格式错误导致XSLT执行失败,保证错误规则能正常完成日志记录和响应返回。
三、额外配置注意
在MPG服务的Error Handling设置中,将该XSLT规则绑定到对应的错误事件(比如Parse Error或General Error),确保请求解析失败时能触发该规则。
内容的提问来源于stack exchange,提问作者Daisy
相关产品推荐
相关产品推荐

