如何在WSO2 APIM的Script Mediator中用JavaScript发送HTTP请求?
在WSO2 APIM的内联Script Mediator中尝试使用fetch、XMLHttpRequest、jQuery发送HTTP请求时遇到以下问题:
- XMLHttpRequest提示“未定义”
- jQuery提示“$未定义”
- fetch出现语法错误
错误日志:
[2022-08-25 15:53:25,508] ERROR - ScriptMediator {api:run:v1} The script engine returned an
error executing the inlined js script function mediate
com.sun.phobos.script.util.ExtendedScriptException: org.mozilla.javascript.EcmaError:
ReferenceError: "$" is not defined. (#5) in at line number 5
使用的Mediator代码:
<script language="js" source="https://code.jquery.com/jquery-1.7.1.min.js"> <![CDATA[ print("before sent########################################"); $.get("http://run.mocky.io/v2/5185415ba171ea3a00704eed", function(data, status){ print("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"); print("Data: DDDDDDDDDDDDDDDDD" + data + "\nStatus: " + status); }); print("sent########################################"); ]]> </script>
为什么之前的方法行不通
WSO2 Script Mediator使用的是Rhino JavaScript引擎,运行在JVM环境而非浏览器环境:
XMLHttpRequest、fetch是浏览器专属API,Rhino引擎不支持- jQuery依赖浏览器DOM和XHR环境,无法在Rhino中直接加载使用
正确实现方式
有两种可靠的方法在WSO2 APIM中发送HTTP请求:
1. Script Mediator结合Java类(脚本内处理场景)
Rhino允许直接调用Java类,可使用org.apache.commons.httpclient或java.net相关类发送请求,示例代码:
<script language="js"> <![CDATA[ importPackage(org.apache.commons.httpclient); importPackage(org.apache.commons.httpclient.methods); var client = new HttpClient(); var getMethod = new GetMethod("http://run.mocky.io/v2/5185415ba171ea3a00704eed"); try { var statusCode = client.executeMethod(getMethod); if (statusCode == HttpStatus.SC_OK) { var response = getMethod.getResponseBodyAsString(); print("Response Data: " + response); } else { print("Request failed with status: " + statusCode); } } finally { getMethod.releaseConnection(); } ]]> </script>
注:commons-httpclient依赖包默认已包含在WSO2 APIM环境中,无需额外添加。
2. 使用Call Mediator(符合WSO2集成规范)
若无需在脚本内处理请求逻辑,推荐使用WSO2原生的Call Mediator,它专门用于发送HTTP/S请求,配置简洁且易维护:
<call> <endpoint> <address uri="http://run.mocky.io/v2/5185415ba171ea3a00704eed"/> </endpoint> </call> <!-- 后续处理示例:提取响应并打印 --> <property name="RESPONSE_DATA" expression="$body"/> <log level="custom"> <property name="Response" expression="$ctx:RESPONSE_DATA"/> </log>
额外提示
- 避免在Script Mediator中使用浏览器端JS API,优先选用WSO2原生Mediator或Java类
- 若需复杂请求配置(如自定义请求头、请求体),Call Mediator支持更丰富的扩展选项
内容的提问来源于stack exchange,提问作者m.feyzollahi

