我们正在实施 WSO2-AM 来处理从我们希望向互联网公开的 Moodle LMS 对一些内部 API 的访问。
我正在通过 WSO2 配置对此 LMS 的访问,但遇到了无法解决的问题。
我意识到 WSO2 文档很广泛,但我实际上无法找到此配置的特定实例。
背景: Moodle 本身以非常非标准的方式实现了它的 API。他们称它们为 REST,但它们并不是真正的宁静。某些参数(例如用户令牌)在 URL 查询字符串中传递,而不是在查询本身的正文中使用标头。
首先,我在 WSO2 中配置了两个 API,一个用于从 Moodle 请求用户令牌(Moodle 需要它以允许特定用户访问 API),另一个用于获取用户注册的课程列表。
通过 WSO2 从 Moodle 获取用户令牌的第一个请求按预期进行。我通过标头将用户名/密码/服务参数传递给 WSO2,如您所料(以便它们通过 HTTPS 加密),它作为 POST 推送到 Moodle。Moodle 通过 WSO2 的响应符合预期,这是一个 JSON 有效负载,其中包含我的客户端然后解析以在后续请求中使用的令牌。
下一个请求是调用 Moodle 中更有用的服务,让用户注册课程。这里提到了两个问题,我不确定如何解决。
问题: Moodle 需要 GET 或 POST 参数来调用网络服务。当我使用便于测试的 GET 时,从客户端传递到 WSO2 的参数要么是错误的(在“userid”的情况下),要么是缺失的(在帖子中的 wstoken 字段的情况下)身体)。
在 API 发布者中,我为 POST 配置了 WSO2 中的 API,其 URL 模式为 {version}/courses/{userid} API 定义配置如下:
网址:http://(moodleurl)/webservice/rest/server.php?wstoken= {uri.var.wstoken}&wsfunction=core_enrol_get_users_courses&moodlewsrestformat=json&userid={uri.var.userid}
Apache 托管 Moodle 收到的 GET URL 是:xx.xx.xx.xx - - [09/Aug/2016:10:36:03 +0930] "POST /webservice/rest/server.php?wstoken=&wsfunction=core_enrol_get_users_courses&moodlewsrestformat =json&userid=6/6 HTTP/1.1" 200 270
因此,这两个问题是缺少 'wstoken' 参数(在提供给 WSO2 的帖子正文中,以及 'userid' 被加倍并在项目之间加上斜线。
我已经通过代理运行客户端,并且数据似乎已正确发送到 WSO2:
所以我想知道我能做些什么来解决这些问题:
是否有不同的 URL 参数可用于在 URL 中正确包含发布到服务 API 地址的正文参数?
我是否有一些特定的配置问题导致 userid 参数以这种方式中断?
来自客户端的发布参数似乎确实包含在 WSO2 发给 Moodle 的帖子中;因此很可能它们可以从 URL 中删除,并简单地包含在 WSO2 的 Moodle 的帖子正文中,这意味着可能只有 userid 参数的问题需要解决才能使其正常工作 - 不幸的是我不是确定如何在 WSO2 和 Moodle 本身之间放置一个代理来验证发布到 API 的参数,而不是使用 Wireshark。