Valence API D2L/ вызовы Brightspace API с сайта WordPress

Я новичок в Valence API и D2L(Brightspace), и в настоящее время у меня возникают проблемы с отправкой запросов API через мою форму регистрации WordPress. Ниже приведены некоторые шаги относительно того, чего я пытаюсь достичь:

  1. Студент записывается на курс через форму регистрации на моем сайте WordPress.
  2. Зачисление передает новую информацию об ученике в функцию doAPIRequest API Valence в файле sample.js.
  3. Вызов Ajax в sample.js содержит действие с именем example_wordpress_action, которое определено в functions.php. Это где запросы API сделаны.
  4. Основная проблема в том, что когда я пытаюсь использовать почтовый запрос, всегда возвращается 400 плохих запросов. Тем не менее, я могу применить запрос GET/ whoami без каких-либо проблем. Есть ли вероятность того, что проблемы связаны с тем, как вводится информация о пользователе?

Ниже приведена копия формата, который используется для отправки информации о созданных пользователях (RoldId используется на сайте D2L, и я использую метод 'POST' и запрос API '/d2l/api/lp/1.4/users/'):

{
  "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] => 
)

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. Ajax, который используется в WordPress: используемое действие называется 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. Funcions.php, где запрос выполняется с помощью wp_remote_request:

function example_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");

Согласно документации для маршрута создания пользователя, 400 Код состояния в качестве ответа указывает на одну из двух вещей: вы как-то предоставили недопустимые данные для новой пользовательской записи, или фоновая служба (по какой-то причине) не смогла создать новую пользовательскую запись (очень редко, но это бывает). Во втором из этих случаев вы получите более подробное сообщение в описании ошибки, указывающее на ошибку при создании. Поскольку вы этого не поняли, наиболее вероятной причиной является одна из них:

  • Вы не отправляете то, что, как вы думаете, вы отправляете; это как-то плохо отформатировано.

  • Вы предоставляете недействительный RoleId - это было действительно в среде, в которой вы тестировали, но в производственной среде, что RoleId не существует Такое бывает иногда, но в этом случае я подозреваю, что нет. Чтобы проверить, попробуйте получить обратно RoleId по Id и просмотрите эти результаты.

  • Вы предоставляете UserNameэто уже существует в системе: это свойство является идентификатором, который вы используете для идентификации себя при входе в систему Brightspace, поэтому оно должно быть уникальным. Иногда клиенты обнаружат, что "временный тест" UserName они по какой-либо причине уже используют их в своем бэк-сервисе, и это может привести к неожиданным сбоям. Вы можете попробовать проверить, вернув пользователя тем самым UserName сначала, чтобы подтвердить, что у вас еще нет записи для этого пользователя.

Другие вопросы по тегам