moodle api用肥皂和coldfusion cfhttp服务

时间:2015-12-15 13:37:57

标签: php soap coldfusion moodle cfc

我正在尝试使用moodle 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(); - 我无法在代码中的任何其他位置使用它,它是否像冷冻中的structnew一样

  2. 拨打肥皂的方式,我迷路了

  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.
    

1 个答案:

答案 0 :(得分:1)

注意 - 这将是复杂的试验和错误,以使这工作。在成功之前,期望必须完成一步,然后再执行下一个错误。

所以我有一个线索 - 假设cfhttp调用返回某种类型的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编译成带有成员(函数和属性)的存根类。其中一个将是core_user_create_users(),它将采用数组对象。棘手的部分将是弄清楚如何格式化该数组以正确传递它。如果幸运的话,CF对象数组([1] [&#34;用户名:abc&#34;])可能会正确序列化。如果没有,你将不得不通过它来试验和错误,直到你弄明白。祝你好运约翰!