MFF8.0中JS客户端调用JS适配器返回415错误的解决求助
这个415错误的核心原因是请求的媒体类型与服务器预期不匹配,而且服务器端没生成日志说明请求根本没到达你的适配器处理逻辑,就被请求解析层拦截了。咱们一步步来修复:
1. 先修复客户端代码的语法错误
你客户端代码里的WLResourceRequest构造函数有个明显的语法问题——URL参数的闭合引号丢了,这会导致代码执行异常,甚至请求都发不出去:
// 错误写法 var resourceRequest = new WLResourceRequest("/adapters/myAdapter/search, WLResourceRequest.POST); // 正确写法 var resourceRequest = new WLResourceRequest("/adapters/myAdapter/search", WLResourceRequest.POST);
2. 正确序列化JSON请求体
虽然你设置了Content-Type: application/json;charset=utf-8,但直接把JavaScript对象传给send()方法是不对的——WLResourceRequest的send()方法如果接收对象,默认会按application/x-www-form-urlencoded格式编码,这就和你设置的Content-Type冲突了,服务器自然返回415。
你需要把对象手动序列化为JSON字符串再发送:
// 原代码 resourceRequest.send(parameters[0]).then(...) // 修改后 resourceRequest.send(JSON.stringify(parameters[0])).then(...)
3. 验证适配器的端点配置
确保你的JavaScript适配器已经正确把search函数暴露为POST端点,检查适配器的XML配置(比如adapter.xml)里的<procedure>标签,应该类似这样:
<procedure name="search" securityTest="wl_unprotected"/>
如果没配置或者配置成了GET请求,也会导致请求被拦截。
4. 额外检查请求头顺序
确保setHeader的调用顺序在send之前,而且没有被后续代码覆盖:
var resourceRequest = new WLResourceRequest("/adapters/myAdapter/search", WLResourceRequest.POST); resourceRequest.setTimeout(60000); // 先设置Content-Type,再发送请求 resourceRequest.setHeader("Content-Type", "application/json;charset=utf-8"); // 然后执行send操作
为什么会出现这个问题?
当你设置了application/json的Content-Type,但实际发送的是表单编码的数据时,服务器的请求解析器无法识别这种不匹配的格式,直接返回415错误,请求根本没机会到达你的search函数,所以服务器端不会生成searching…的日志。
按上面的步骤修改后,应该就能正常调用适配器了。
内容的提问来源于stack exchange,提问作者Yasuo Asakawa

