如何在XSLT中使用IBM Datapower dp:url-open函数调用HTTP方法
IBM DataPower 中使用 dp:url-open 调用不同HTTP方法的XSLT实现
基本原理
dp:url-open是IBM DataPower提供的专属XSLT扩展函数,使用前需要先声明命名空间http://www.datapower.com/extensions- 不同HTTP请求方法通过
dp:url-open-target节点下的http标签的method属性指定,同时配合请求头、请求payload完成对应请求的构造 - 函数返回值为包含响应头、响应体、状态码的节点集,可直接通过XPath提取所需内容
通用前置声明
所有示例都需要先引入如下命名空间,实际使用时将业务逻辑模板包裹在该样式表节点内:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:dp="http://www.datapower.com/extensions" extension-element-prefixes="dp"> <!-- 业务逻辑模板写在此处 --> </xsl:stylesheet>
各HTTP方法实现示例
GET 请求
GET请求通常用于查询资源,无需传递请求体,可直接将查询参数拼接在URL中:
<xsl:template match="/"> <!-- 目标URL,可拼接查询参数 --> <xsl:variable name="targetUrl" select="'https://example.com/api/user?id=123'"/> <!-- 构造请求参数 --> <xsl:variable name="requestParams"> <dp:url-open-target> <http method="GET" url="{$targetUrl}" cache="no"> <headers> <header name="Accept">application/json</header> </headers> </http> </dp:url-open-target> </xsl:variable> <!-- 发起请求,binaryNode表示返回二进制节点格式,适配任意响应类型 --> <xsl:variable name="response" select="dp:url-open($requestParams, 'binaryNode')"/> <!-- 输出响应体 --> <xsl:copy-of select="$response/dp:response/body"/> </xsl:template>
cache="no"属性用于关闭GET请求默认缓存,可根据业务需求选择是否添加。
POST 请求
POST通常用于提交数据创建资源,需要指定请求体和对应的Content-Type头:
<xsl:template match="/"> <xsl:variable name="targetUrl" select="'https://example.com/api/user'"/> <!-- 构造请求payload,此处示例为JSON格式 --> <xsl:variable name="postPayload"> { "username": "test_user", "email": "test@example.com" } </xsl:variable> <xsl:variable name="requestParams"> <dp:url-open-target> <http method="POST" url="{$targetUrl}"> <headers> <header name="Content-Type">application/json</header> <header name="Accept">application/json</header> </headers> <body> <xsl:copy-of select="$postPayload"/> </body> </http> </dp:url-open-target> </xsl:variable> <xsl:variable name="response" select="dp:url-open($requestParams, 'binaryNode')"/> <xsl:copy-of select="$response/dp:response/body"/> </xsl:template>
PUT(CREATE)请求
PUT通常用于更新指定ID的资源,部分场景也用于创建指定ID的资源,逻辑与POST一致,仅修改method属性即可:
<xsl:template match="/"> <xsl:variable name="targetUrl" select="'https://example.com/api/user/123'"/> <xsl:variable name="putPayload"> { "email": "update@example.com" } </xsl:variable> <xsl:variable name="requestParams"> <dp:url-open-target> <http method="PUT" url="{$targetUrl}"> <headers> <header name="Content-Type">application/json</header> </headers> <body> <xsl:copy-of select="$putPayload"/> </body> </http> </dp:url-open-target> </xsl:variable> <xsl:variable name="response" select="dp:url-open($requestParams, 'binaryNode')"/> </xsl:template>
DELETE 请求
DELETE用于删除指定资源,通常不需要传递请求体,部分特殊接口需要的话可参考POST的方式添加body节点:
<xsl:template match="/"> <xsl:variable name="targetUrl" select="'https://example.com/api/user/123'"/> <xsl:variable name="requestParams"> <dp:url-open-target> <http method="DELETE" url="{$targetUrl}"> <headers> <header name="Accept">application/json</header> </headers> </http> </dp:url-open-target> </xsl:variable> <xsl:variable name="response" select="dp:url-open($requestParams, 'binaryNode')"/> <!-- 示例:提取HTTP响应状态码 --> <xsl:variable name="httpCode" select="substring-before($response/dp:response/headers/header[@name='x-dp-response-code'], ' ')"/> </xsl:template>
注意事项
- 如果请求的是HTTPS接口,需要在DataPower中提前配置对应后端的SSL客户端配置,在http节点添加
ssl-client-profile="你的SSL配置名"属性即可调用 - 响应中内置的
x-dp-response-code头值格式为状态码 原因短语,例如200 OK,可通过字符串截取获取纯状态码 - 若后端返回XML格式数据,可将
dp:url-open的第二个参数改为xml,直接返回XML节点集方便解析
内容的提问来源于stack exchange,提问作者toy
相关产品推荐
相关产品推荐

