Загрузка пакета в репозиторий с помощью PHP + curl

Мне нужно загрузить пакет SCORM из PHP в экземпляр D2L. У меня есть все необходимые ключи и данные, потому что другие запросы (например, запрос GET для получения данных профиля пользователя). Я также протестировал загрузку из плагина Advanced REST для Chrome, и он работал правильно, выдавая Repository.LRWSPublishResult с новым идентификатором объекта обучения и т. д.

Когда я пытаюсь выполнить загрузку с PHP с помощью CURL (мой код основан на GettingStartedSample), я всегда получаю ответ «Объект перемещен в /d2l/error/404». Я читал, что это может быть вызвано префиксом «https» URL-адреса, и я должен использовать параметр CURLOPT_FOLLOWLOCATION, но это не помогает. Он следует за перенаправлением и возвращает пустой ответ.

Я делаю запрос PUT на

/d2l/api/lr/1.0/objects/?repositoryId=REPO_ID

У кого-нибудь есть рабочий код для этого и может дать мне несколько советов? Спасибо!


person Michal    schedule 17.04.2013    source источник


Ответы (1)


Вот некоторый PHP-код:

$apiRoute = "/d2l/api/lr/1.0/objects/?repositoryId=" . $repoID;

$id = uniqid();
$data = "--" . $id . "\r\n".
        "Content-Disposition: form-data; name=\"Resource\"; filename=\"HW_SCORM.zip\"\r\n".
        "Content-Type: application/zip\r\n".
        "\r\n".
        file_get_contents("HW_SCORM.zip") . "\r\n".
        "--" . $id . "--";

$uri = $opContext->createAuthenticatedUri($apiRoute, "PUT");

curl_setopt($ch, CURLOPT_URL, $uri);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
  "Content-Type: multipart/form-data; boundary=" . $id,
  "Content-Length: " . strlen($data))
);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);                                                                     

$response = curl_exec($ch);

Он отправит что-то вроде следующего:

Content-Type: multipart/form-data; boundary=ba5567548ef846b595f2d8f0ee5a1ca4
Accept: */*
Content-Length: {size}

--ba5567548ef846b595f2d8f0ee5a1ca4
Content-Disposition: form-data; name="Resource"; filename="HW_SCORM.zip"
Content-Type: application/zip

{file_data}
--ba5567548ef846b595f2d8f0ee5a1ca4--

И в ответ вы должны увидеть что-то вроде

HTTP/1.1 100 Continue

HTTP/1.1 200 OK
Cache-Control: no-cache, no-store
Pragma: no-cache
Content-Length: 73
Content-Type: application/json; charset=UTF-8
Expires: -1
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
Date: Wed, 17 Apr 2013 21:02:42 GMT

{"IdentId":15805,"Version":1,"ExecutionMessage":null,"ExecutionStatus":0}

Случайное предположение: если вы забудете завершающую новую строку после содержимого файла и перед конечным граничным маркером, похоже, что LOR отправит ответ 303, говорящий вам перейти на страницу 404.

person Jacob Parker    schedule 17.04.2013
comment
Это работает, большое спасибо. Я использовал другой метод, чем создание строки содержимого запроса вручную, поэтому у меня не было полного контроля над ней. Благодарить! - person Michal; 18.04.2013