Valence API D2L/ вызовы Brightspace API с сайта WordPress
Я новичок в Valence API и D2L(Brightspace), и в настоящее время у меня возникают проблемы с отправкой запросов API через мою форму регистрации WordPress. Ниже приведены некоторые шаги относительно того, чего я пытаюсь достичь:
- Студент записывается на курс через форму регистрации на моем сайте WordPress.
- Зачисление передает новую информацию об ученике в функцию doAPIRequest API Valence в файле sample.js.
- Вызов Ajax в sample.js содержит действие с именем example_wordpress_action, которое определено в functions.php. Это где запросы API сделаны.
- Основная проблема в том, что когда я пытаюсь использовать почтовый запрос, всегда возвращается 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 ответа
С тех пор я смог решить эту проблему с некоторой помощью. ниже приведен код, который я использовал, на случай, если в будущем появятся другие.
выдержка из 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>
Страница отправки формы. Звонок 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>'; ?>
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) { }, });
}
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
сначала, чтобы подтвердить, что у вас еще нет записи для этого пользователя.