我们正在实施WSO2-AM来处理我们希望暴露给互联网的Moodle LMS对某些内部API的访问。
我正在通过WSO2配置对此LMS的访问,但我遇到了一个无法解决的问题。
我意识到WSO2文档很广泛,但我无法真正找到此配置的特定实例。
背景: Moodle本身已经以非标准的方式实现了API。他们称他们为REST,但他们并不是真正的宁静。某些参数(例如用户令牌)在URL查询字符串中传递,而不是在查询本身的主体中使用。
首先,我在WSO2中配置了两个API,一个用于从Moodle请求用户令牌(Moodle要求允许访问特定用户的API),另一个用于获取用户注册的课程列表。
通过WSO2从Moodle获取用户令牌的第一个请求按预期进行。我通过标题传递用户名/密码/服务参数(因此它们通过HTTPS加密)到WSO2,它作为POST推送到Moodle。 Moodle通过WSO2的响应是预期的,一个包含令牌的JSON有效负载,然后我的客户端解析该令牌以用于后续请求。
接下来的请求是在Moodle中调用更有用的服务,以获得用户注册的课程。这里提到了两个问题,我不确定如何解决。
问题: Moodle需要GET或POST参数来调用Web服务。当我使用GET(这对于测试很方便)时,从客户端传递到WSO2的参数要么是错误的(在'userid'的情况下)要么是丢失的(在wstoken字段的情况下,在帖子中)体)。
在API发布商中,我将WSO2中的API配置为POST,其网址格式为{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'在项目之间用斜杠加倍。
所以我想知道我能对这些问题做些什么:
我可以使用不同的网址参数在网址中正确包含已发布的正文参数吗?
我是否有一些特定的配置问题导致userid参数以这种方式中断?
来自客户端的发布参数似乎包含在WSO2的Moodle帖子中;所以很可能它们可以从URL中删除,并且只是通过WSO2简单地包含在Moodle的帖子体中,这意味着它可能只是需要解决的userid参数的问题才能让它工作 - 不幸的是我不是确定如何在WSO2和Moodle本身之间放置一个代理来验证发布到API的参数,而不是使用Wireshark。
答案 0 :(得分:1)
'用户ID'由于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后缀:
<property name="REST_URL_POSTFIX" scope="axis2" action="remove"/>
&#13;
有关详细信息,请参阅[1]中给出的链接。
您可以在中介运行时使用属性值和&#34; uri.var来读取资源(网址)中的变量。&#34;字首。例如,在您的情况下,HTTP端点将 wstoken 和 userid 作为uri变量。但 wstoken 包含在请求的正文部分中。因此,您无法通过将 wstoken = {uri.var.wstoken} 作为查询参数引入端点来添加它。解决此问题的一种方法是将wstoken定义为查询参数,方法是将参数类型更改为查询。另一种方法是你可以在传入请求的标题中定义它。