0

我们正在实施 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 定义配置如下: API 定义

API端点配置为: 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: 客户端->WSO2 代理

所以我想知道我能做些什么来解决这些问题:

是否有不同的 URL 参数可用于在 URL 中正确包含发布到服务 API 地址的正文参数?

我是否有一些特定的配置问题导致 userid 参数以这种方式中断?

来自客户端的发布参数似乎确实包含在 WSO2 发给 Moodle 的帖子中;因此很可能它们可以从 URL 中删除,并简单地包含在 WSO2 的 Moodle 的帖子正文中,这意味着可能只有 userid 参数的问题需要解决才能使其正常工作 - 不幸的是我不是确定如何在 WSO2 和 Moodle 本身之间放置一个代理来验证发布到 API 的参数,而不是使用 Wireshark。

4

1 回答 1

1

由于 API 资源的 URI 模板会在运行时自动附加到 HTTP 端点的末尾,因此“userid”在项目之间用斜线加倍。对于您的示例,您将端点 url 定义为:

http://(moodleurl)/webservice/rest/server.php?wstoken={uri.var.wstoken}&wsfunction=core_enrol_get_users_courses&moodlewsrestformat=json&userid={uri.var.userid}

然后 url 模式 ( /{userid} ) 默认附加到端点 url。要解决此问题,您可以使用以下中介设置从后端端点删除 URL 后缀:

<property name="REST_URL_POSTFIX" scope="axis2" action="remove"/>

有关这方面的更多信息,请参阅 [1] 中给出的链接。

您可以在中介运行时使用带有“uri.var”的属性值读取资源(url)中的变量。字首。例如,在您的情况下,HTTP 端点获取wstokenuserid作为 uri 变量。但是wstoken包含在请求的正文部分中。因此,您不能通过将wstoken={uri.var.wstoken}作为查询参数引入端点来添加它。解决此问题的一种方法是通过将参数 Type更改为query来将 wstoken 定义为查询参数。另一种方法是您可以在传入请求的标头中定义它。

[1]。https://docs.wso2.com/display/AM190/Map+the+Parameters+of+your+Backend+URLs+with+the+API+Publisher+URLs

于 2016-08-09T04:12:30.910 回答