WSO2 - Api 经理 - 将 Post Body 参数作为 URL 查询字符串传递给 Moodle

WSO2 - Api Manager - Passing Post Body Params as URL query strings to Moodle

我们正在实施 WSO2-AM 来处理我们希望公开给互联网的 Moodle LMS 对某些内部 API 的访问。

我正在通过 WSO2 配置对此 LMS 的访问,但我 运行 遇到了一个我无法解决的问题。

我知道 WSO2 文档很丰富,但我无法真正找到此配置的特定实例。

背景: Moodle 本身已经以非常 non-standard 的方式实现了它的 API。他们称它们为 REST,但它们并不是真正的 restful。某些参数(例如用户令牌)在 URL 查询字符串中传递,而不是在查询本身的 body 中使用 headers。

首先,我在 WSO2 中配置了两个 APIs,一个用于从 Moodle 请求用户令牌(Moodle 要求它允许特定用户访问 API)和另一个获取用户注册的课程列表。

通过 WSO2 从 Moodle 获取用户令牌的第一个请求按预期进行。正如您所期望的那样,我通过 header 将 username/password/service 参数传递给 WSO2(以便它们通过 HTTPS 加密),然后将其作为 POST 推送到 Moodle。 Moodle 通过 WSO2 的响应与预期一致,一个 JSON 有效载荷包含一个令牌,然后我的客户端解析该令牌以用于后续请求。

下一个请求是调用 Moodle 中更有用的服务,让用户注册课程。这里有两个问题我不确定如何解决。

问题: Moodle 需要 GET 或 POST 参数来调用 web-service。当我使用便于测试的 GET 时,从客户端传递到 WSO2 的参数要么错误(在 'userid' 的情况下),要么丢失(在 wstoken 字段的情况下,它在post body).

在 API 发布者中,我在 WSO2 中为 POST 配置了 API,URL 模式为 {version}/courses/{userid} API定义配置如下:

API端点配置为:

URL: 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 的 post body 中,以及 'userid' 被加倍项目之间的斜杠。

我有 运行 通过代理的客户端,数据似乎已正确发送到 WSO2:

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

是否有一个不同的 URL 参数我可以用来在 URL 服务 API 中正确包含一个 posted body 参数地址?

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

来自客户端的 posted 参数确实包含在 WSO2 的 post 到 Moodle 中;因此它们很可能可以从 URL 中删除并简单地包含在 post body 到 Moodle 中,这意味着它可能只是需要的 userid 参数的问题决定允许它工作 - 不幸的是,我不确定如何在 WSO2 和 Moodle 本身之间放置一个代理来验证 posted 到 API 的参数,而不是使用 Wireshark。

'userid' 在项目之间用斜杠加倍,因为 API 资源的 URI 模板在运行时自动附加到 HTTP 端点的末尾。例如,您将端点 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] 中给出的 link。

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

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