javascript — API-интерфейсы Valence для вызовов D2L / Brightspace с сайта 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": "[email protected]",
"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

Решение

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

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

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

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

1

Другие решения

С тех пор я смог решить эту проблему с некоторой помощью. ниже приведен код, который я использовал, на случай, если в будущем появятся другие.

  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");
1

По вопросам рекламы [email protected]