【问题标题】:Valence API D2L/Brightspace API calls from WordPress Site来自 WordPress 站点的 Valence API D2L/Brightspace API 调用
【发布时间】:2015-06-09 17:03:39
【问题描述】:

我是 Valence API 和 D2L(Brightspace) 的新手,我目前在通过我的 WordPress 注册表格发送 API 请求时遇到问题。以下是我要达到的目标的一些步骤:

  1. 一名学生通过我的 WordPress 网站上的注册表单注册/注册课程
  2. 注册将新的学生信息传递给 sample.js 中的 Valence API doAPIRequest 函数
  3. sample.js 中的 Ajax 调用包含一个名为“example_wordpress_action”的操作,该操作在 functions.php 中定义。这是发出 API 请求的地方。
  4. 主要问题是当我尝试使用 post 请求时,总是返回 400 Bad Request。但是,我可以毫无问题地应用 GET/whoami 请求。问题是否与输入用户信息的方式有关?

下面是用于发送创建的用户信息的格式的副本(RoldId 正在 D2L 站点上使用,我正在使用方法 'POST' 和 API 请求的 '/d2l/api/lp/ 1.4/用户/'):

{
  "OrgDefinedId": "SBoateng",
  "FirstName": "Samuel",
  "MiddleName": "",
  "LastName": "Boateng",
  "ExternalEmail": "daerdocta@gmail.com",
  "UserName": "SBoateng",
  "RoleId": 103,
  "IsActive": true,
  "SendCreationEmail": false
}

这是请求返回的内容:

Unexpected non-JSON response from the server: 
Array
(
    [headers] => Array
        (
            [cache-control] => private
            [content-length] => 0
            [server] => Microsoft-IIS/7.5
            [x-powered-by] => ASP.NET
            [x-xss-protection] => 0
            [date] => Tue, 23 Jun 2015 18:35:05 GMT
            [connection] => close
        )

    [body] => 
    [response] => Array
        (
            [code] => 400
            [message] => Bad request
        )

    [cookies] => Array
        (
        )

    [filename] => 
)

【问题讨论】:

  • 欢迎来到stackoverflow。也许您可以编辑问题以更明确地告诉我们问题所在并给出可能的错误/调试输出?
  • 您好,我对原始帖子进行了一些更改。我遇到的主要问题是我无法发送 API 请求。
  • 添加了 D2L 支持指南推荐的desire2learn 标签。这看起来不像是一个简单的问题和答案,而更像是调试代码或入门的尝试;也许您最好访问 D2L 的开发社区论坛。此外,向他们提供您的确切 HTTP 请求/响应的网络跟踪可能会帮助他们更好地为您提供帮助。
  • 查看确切的 HTTP 请求会很有帮助,但这种来回调试的正确位置是 Brightspace 开发者社区论坛,而不是这里。

标签: javascript php ajax wordpress desire2learn


【解决方案1】:

根据documentation for the create-user route,作为响应的400 状态代码表明以下两种情况之一:您以某种方式为新用户记录提供了无效数据,或者后端服务(出于某种原因)无法创建新的用户记录(非常罕见,但确实会发生)。在第二种情况下,您会在错误描述中收到更详细的消息,指示创建失败。由于您没有得到这个,最可能的原因是以下之一:

  • 您发送的不是您认为发送的内容;它的格式不正确。

  • 您提供的RoleId 无效——它在您测​​试的环境中有效,但在生产环境中,RoleId 不存在。有时会发生这种情况,但在这种情况下,我怀疑不会。要进行验证,请先尝试按 Id 取回 RoleId,然后查看这些结果。

  • 您提供的UserName已存在于系统中:此属性是您在登录 Brightspace 系统时用来标识自己的 ID,因此它必须是唯一的。有时客户会发现他们正在使用的“临时测试”UserName 已经存在于他们的后端服务中,无论出于何种原因,这可能会导致令人惊讶的失败。您可以尝试先通过 UserName 取回用户来进行验证,以验证您还没有该用户的记录。

【讨论】:

  • 我在 API 测试工具中测试了这个相同的 json 字符串,但它能够毫无问题地发送并创建用户。我还检查以确保我指定的用户名没有被使用。 103的roleId也在直播系统中使用。
  • 如果 API 测试工具按照您的预期通过 JSON 结构发送,并且您已验证您的后端服务 (a) 没有该值的 UserName,并且 ( b) 确实有 RoleId(并且您使用 API 测试工具和您自己的 LMS 似乎确实支持这两种说法),那么问题几乎肯定在于您的代码没有发送您的想法 它正在发送。显示您发送的确切 HTTP 请求的连线日志将非常有助于确保您的代码按照您的想法运行。
  • 你是对的。代码未发送格式正确的 JSON 结构。它通过一个带有转义字符的字符串发送。我已经纠正了这个问题。感谢您的帮助。
【解决方案2】:

我已经能够在一些帮助下解决这个问题。以下是我使用的代码,以防将来有人遇到此问题。

  1. 保存表单的 PHP 摘录:

                            <input class="required textInput" id="name_first" name="name_first"  size="35" maxlength="255" placeholder= "First Name"  type="text" value="<?php echo $_SESSION["student_profile"]["name_first"]; ?>" required />
                            <label class="required_lables" for="name_first"><em></em></label>
    
                            <!--  Middle Initial  -->
                            <label for="name_middle"><em></em></label>
                            <input class="textInput optional" id="name_middle" name="name_middle" size="35" maxlength="255" placeholder= "Middle Name (optional)" type="text" value="<?php echo $_SESSION["student_profile"]["name_middle"]; ?>" />
    
                            <!--  Last Name  -->
                            <input class="required textInput" id="name_last" name="name_last"  size="35" maxlength="255" placeholder= "Last Name" type="text" value="<?php echo $_SESSION["student_profile"]["name_last"]; ?>" required/>
                            <label class="required_lables" for="name_last"><em></em></label>
    
  2. 表单提交页面。 Ajax 调用在这里进行:

    $_SESSION['student_profile'] = $_POST;

    $first_name=$_SESSION['student_profile']['name_first'];

    $middle_name =$_SESSION['student_profile']['middle_name'];

    $last_name =$_SESSION['student_profile']['last_name'];

    $email =$_SESSION['student_profile']['email'];

    echo '<script>';
    echo 'var data = {"OrgDefinedId": "'. $orgDefinedId .'",  "FirstName": "'. $first_name .'",  "MiddleName": "'. $middle_name .'",  "LastName": "'. $last_name .'",  "ExternalEmail": "'. $email .'",  "UserName": "'. $uName .'",  "RoleId": 103,  "IsActive": true,  "SendCreationEmail": false};';
    echo 'var type = "CREATE";';
    echo 'window.$vars = {dataField : data};';
    echo 'window.$vartype = {typeField : type};';
    echo 'doAPIRequest();';//direction to js file with the ajax call
    echo '</script>';
    
    ?>
    
  3. wordpress 中使用的 Ajax:使用的动作称为 example_wordpress_action,它在 functions.php 中定义

    function doAPIRequest() {
     var host = "myHostSite.com";
     var port = "443";
     var scheme = "https";
     var req = "/d2l/api/lp/1.4/users/";
     var method =  "POST";
     var typeAPI = window.$vartype.typeField;
     var ajaxurl = "/wp-admin/admin-ajax.php";  
     var data = window.$vars.dataField;     
     var userName = window.$varsUname.useNameField;
     var anon = "";
     var appId = myAppID;
     var appKey = myAppKey;
            $.ajax({
                url: ajaxurl,
                data: {
                    action : 'example_wordpress_action',
                    host: host,
                    port: port,
                    scheme: scheme,
                    anon: anon,
                    apiRequest: req,
                    typeapp: typeAPI,
                    apiMethod: method,
                    appUser: userName,
                    data: data,
                    appId: appId,
                    appKey: appKey
                },
                success: function(data) {
                    var output;
                    if(data == '') {
                        output = 'Success!';
                        return;
                    } else {
                        try {
                            output = JSON.stringify(JSON.parse(data), null, 4);
                        } catch(e) {
                            output = "Unexpected non-JSON response from the server: " + data;
                        }
                    }
                },
                error: function(jqXHR, textStatus, errorThrown) {               
                },
            });
    

    }

  4. 使用 wp_remote_request 发出请求的Funcions.php:

函数示例_wordpress_action_function() {

    $host = $_GET['host'];
    $port = $_GET['port'];
    $scheme = $_GET['scheme'];
    $data = $_GET['data'];
    $apiMethod = $_GET['apiMethod'];
    $appId = $_GET['appId'];
    $appKey = $_GET['appKey'];
    $appRequest = $_GET['apiRequest'];
    $appUserName = $_GET['appUser'];

    $data_string = json_encode($data);

    $userId = $myUserId;
    $userKey = $myUserKey;

    $authContextFactory = new D2LAppContextFactory();
    $authContext = $authContextFactory->createSecurityContext($appId, $appKey);
    $hostSpec = new D2LHostSpec($host, $port, $scheme);
    $opContext = $authContext->createUserContextFromHostSpec($hostSpec, $userId, $userKey);

    $uri = $opContext->createAuthenticatedUri($appRequest, $apiMethod);
    $headers = array( 'authorization' => 'basic ', 'accept' => 'application/json', 'content-type' => 'application/json', 'content-length' => strlen( $data_string ) ); 
    $post = array( 'method' => $apiMethod, 'headers' => $headers, 'body' => $data_string );
    $createResponses = wp_remote_request($uri, $post);
    die();
}
add_action( 'wp_ajax_example_wordpress_action', 'example_wordpress_action_function' );
add_action("wp_ajax_nopriv_example_wordpress_action", "example_wordpress_action_function");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多