moodle api 与 soap 和 coldfusion cfhttp 服务

moodle api with soap and coldfusion cfhttp service

我正在尝试 api 构建 coldfusion,但我对一些事情感到困惑

首先,我使用 soap 选项通过以下代码调用服务器:

$functionname = 'core_user_create_users';
$user1 = new stdClass();
$user1->username = 'abcd';
$user1->password =  'Password123!';
$user1->firstname = 'ali';
$user1->lastname = 'asdsad';
$user1->email = 'asd@asd.com';
$user1->city = 'apo';
$user1->country = 'addfa';
$user1->auth = 'manual';
$params = array($user1);

// SOAP CALL
$serverurl = 'http://your_install.com/webservice/soap/server.php?wsdl=1&wstoken=your_token';
///Do the main soap call
$client = new SoapClient($serverurl);
try {
  $resp = $client->__soapCall($functionname, array($params));
}
catch (SoapFault $e) {
  exit($e->faultstring);
}

我几乎没有疑问:

  1. 它使用 $user1 = new stdClass(); - 我不能在代码的其他任何地方使用它,它是否类似于 coldfusion

  2. 中的 structnew
  3. 打肥皂电话的方式,我迷路了

我的 coldfusion 代码如下

<cffunction access="remote" name="core_user_create_users" returntype="any" returnformat="json" hint="Create Users for Moodle">
    <cfargument name="structform" default="" type="struct">
    <cfset var getMoodleToken = getTokenFromMoodle()>
    <cfset var createURL = getDomainName()>
    <cfset var services = "/webservice/soap/server.php?wsdl=1&wstoken=" & getMoodleToken>
    <cfhttp url="#createURL##services#" method="get">
</cffunction>

但在 cfhttp 通话后我不确定该怎么做并通过,请指导

更新#1

现在进行这样的调用并收到此错误

<cffunction access="remote" name="getAllFunctions" returntype="any" returnformat="json" hint="Get all avaliable Functions from Moodle">
    <cfset var getMoodleToken = getExternalTokenFromMoodle()>
    <cfset var createURL = getDomainName()>
    <cfset var services = createURL & "/webservice/soap/server.php?wsdl=1&wstoken=" & getMoodleToken>
    <cfset obj = createobject("webservice",services)>
    <cfreturn obj>
</cffunction>

<cffunction access="remote" name="createUser" returntype="any" returnformat="json" hint="Create Users for Moodle">
    <cfargument name="structform" default="" type="struct">
    <cfset obj = getAllFunctions()>
    <cfset var user = structnew()>
    <cfset user.username = arguments.structform.username>
    <cfset user.password = arguments.structform.password>
    <cfset user.firstname = arguments.structform.firstname>
    <cfset user.lastname = arguments.structform.lastname>
    <cfset user.email = arguments.structform.email>
    <cfset user.auth = arguments.structform.auth>
    <cfset user.idnumber = arguments.structform.idnumber>
    <cfset user.lang = arguments.structform.lang>
    <cfset user.theme = arguments.structform.theme>
    <cfset user.timezone = arguments.structform.timezone>
    <cfset user.mailformat = arguments.structform.mailformat>
    <cfset user.description = arguments.structform.description>
    <cfset user.city = arguments.structform.city>
    <cfset user.country = arguments.structform.country>
    <cfset objResults = obj.core_user_create_users(user)>
    <cfdump var="#objResults#">
</cffunction>

Unable to create web service argument class [Ljava.lang.Object;. Error: java.lang.InstantiationException: [Ljava.lang.Object;. Often this is because the web service defines an abstract complexType as an input to an operation. You must create an actual instance of this type in Java.
Message     Error converting CFML arguments to Java classes for web service invocation.

注意 - 这将是复杂的反复试验才能使它正常工作。在成功之前,预计必须先完成一个步骤然后再处理下一个错误。

所以我为您提供了一条线索 - 假设 cfhttp 调用 returns 某种 WSDL,您应该能够使用组件调用。试试这个:

<cffunction access="remote" name="core_user_create_users" returntype="any" returnformat="json" hint="Create Users for Moodle">
    <cfargument name="structform" default="" type="struct">
    <cfset var getMoodleToken = getTokenFromMoodle()>
    <cfset var createURL = getDomainName()>
    <cfset var services = "/webservice/soap/server.php?wsdl=1&wstoken=" & getMoodleToken>

    <cfset obj = createobject("webservice",services)>
    <cfdump var="#obj#">

</cffunction>

WSDL 应编译成具有成员(函数和属性)的存根 class。其中之一将是 core_user_create_users(),它将采用一个数组对象。棘手的部分是弄清楚如何格式化该数组以正确传递它。如果幸运的话,CF 对象数组 ([1]["username:abc"]) 可能会正确序列化。如果没有,您将不得不反复试验直到弄清楚。约翰,祝你好运!