7.10 Получение узла в качестве авторизованного пользователя через службы 3 и отдых

drupal.stackexchange https://drupal.stackexchange.com/questions/19601

  •  22-10-2019
  •  | 
  •  

Вопрос

Я новичок в Drupal. Моя цель состоит в том, чтобы использовать его для персонала для управления собственным контентом, а затем получить свой контент из узлов через отдых на существующий публичный веб -сайт.

Используя Drupal 7.10, службы 3. Drupal находится в подкаталоге, а не в корне сайта, если это важно. Конечная точка, названная «REST», была создана для сервера отдыха. Анонимный доступ не желателен, поэтому пользователь Drupal был создан для аутентифицированных запросов доступа.

Я строю клиент PHP на основе Пост Майклколе для доступа к авто. Кажется, он разговаривает с остальным сервером, так как сначала я видел тему нашего сайта Drupal вместе с ошибкой Drupal на моей общей странице PHP.

В настоящее время я пытаюсь войти в систему только в качестве пользователя службы, поэтому на моей странице работает только код login.php.

PHP возвращает это:

Ответ: Строка (0) «Фактальная ошибка: исключение Uncaught 'Exception' с помощью сообщения 'String не может быть проанализирована как xml' в /пат-to-my-page/test-drupal-rest.php:36 Stack Trace: # 0 /path-to-my-page /test- drupal-rest.php (36): simplexmlelement-> __ construct ('') #1 {main} брошен /path-to-my-page /test-drupal-rest .php в строке 36

Строка 36 - это:

$xml = new SimpleXMLElement($response);

Если я просто введу полный URL в браузере ( http://www.mydomain.com/drupal-folder/rest/user/login.xml ), Я получаю (xml разбит с пробелами для отображения здесь):

<? xml version = "1.0" Encoding = "UTF-8"?> <Результат/>

У меня нет идей. Вы можете помочь?

РЕДАКТИРОВАТЬ/ОБНОВЛЕНИЕ: Я вошел в администрирование »Структура» Услуги и обнаружил, что «Приложение/XWW-Form-UrlencoDed» в соответствии с анализом запроса было отключено. Я включил это, и мои просьбы начали проходить. Однако, несмотря на то, что он, очевидно, распознает мою пользовательскую авторитет, я все еще не могу получить узел.

=====================

РЕДАКТИРОВАТЬ/ОБНОВЛЕНИЕ 2012-01-16 15:10: Вот мой текущий код, основанный на коде Michaelcole и модифицирован для моего рабочего процесса и цели. Он не получает содержимое узла. Отказ, по -видимому, находится где -то при отправке аутентификации сеанса с помощью запроса узла. Вход всегда работает правильно, и я всегда получаю свой объект пользователя XML.

loginToDrupal();

$service_url = "http://mysite.com/drupal-folder/resttest/node/10.xml";

$session_cookie = file_get_contents('session_cookie.txt');

print "Ready to send cURL to $service_url";

// set up the request
$curl = curl_init($service_url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);  // have curl_exec return a string
curl_setopt($curl, CURLOPT_COOKIE, "$session_cookie"); // use the previously saved session
curl_setopt($curl, CURLOPT_HTTPGET, true); //do a GET ^^^^added by me...
curl_setopt($curl, CURLOPT_VERBOSE, true); // output to command line

$response = curl_exec($curl);
curl_close($curl);
print "\n<br />RESPONSE:\n";
var_dump($response);

logoutOfDrupal();

//=======================================================================


function loginToDrupal()
    {
    $service_url = 'http://www.mysite.com/drupal-folder/rest/user/login.xml'; // .xml asks for xml data in response
    $post_data = array(
          'username' => 'myusername',
          'password' => 'mypass',
        );
    $post_data = http_build_query($post_data, '', '&'); // Format post data as application/x-www-form-urlencoded

    // set up the request
    $curl = curl_init($service_url);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);  // have curl_exec return a string
    curl_setopt($curl, CURLOPT_POST, true);             // do a POST
    curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data); // POST this data

    // make the request
    curl_setopt($curl, CURLOPT_VERBOSE, true); // output to command line
    $response = curl_exec($curl);
    curl_close($curl);
    print "\n<br />RESPONSE:\n";
    var_dump($response);

    // parse the response
    $xml = new SimpleXMLElement($response);
    $session_cookie = $xml->session_name .'='. $xml->sessid;

    file_put_contents('session_cookie.txt', $session_cookie);

    if($xml->sessid!="")
        {
        print "login successful, session $xml->sessid <br />";
        }
    else
        {
        print "Login appears to have failed.";
        }
    }

//========================================================================================

function logoutOfDrupal()
    {
    print "\n<br />Logging out...<br />";
    $service_url = 'http://mysite.com/drupal-folder/rest/user/logout';
    $session_cookie = file_get_contents('session_cookie.txt');

    // set up the request
    $curl = curl_init($service_url);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);  // have curl_exec return a string
    curl_setopt($curl, CURLOPT_COOKIE, "$session_cookie"); // use the previously saved session
    curl_setopt($curl, CURLOPT_POST, true);             // do a POST
    curl_setopt($curl, CURLOPT_POSTFIELDS, ""); // POST this data

    // make the request
    curl_setopt($curl, CURLOPT_VERBOSE, true); // output to command line
    $response = curl_exec($curl);
    curl_close($curl);
    print "\n<br />RESPONSE:\n";
    var_dump($response);
    print "\n<br />reached end of function logoutOfDrupal()<br />";
    }

Вызов печати отладки после функции LogintOdrupal () всегда возвращает XML, как это:

< ?xml version="1.0" encoding="utf-8"? >< result >< sessid >AU7yWNWPXxORI2DsdJVegdreg2F9rYQxy90dAB5px2s< /sessid >< session_name >SESSd9af11d86664849a8dcda2d6c4af3580< /session_name >< user >< uid >11< /uid >< name >myuser< /name >< mail >me@mysite.com< /mail >< theme >< /theme >< signature >< /signature >< signature_format >filtered_html< /signature_format >< created >1326401726< /created >< access >1326746687< /access >< login >1326748351< /login >< status >1< /status >< timezone >America/Denver< /timezone >< language >< /language >< picture/ >< init >me@mysite.com< /init >< data >< contact >1< /contact >< /data >< roles is_array="true" >< item >authenticated user< /item >< /roles >< rdf_mapping >< rdftype is_array="true" >< item >sioc:UserAccount< /item >< /rdftype >< name >< predicates is_array="true" >< item >foaf:name< /item >< /predicates >< /name >< homepage >< predicates is_array="true" >< item >foaf:page< /item >< /predicates >< type >rel< /type >< /homepage >< /rdf_mapping >< /user >< /result >

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

Это было полезно?

Решение

Сегодня я обнаружил простую проблему с моему примеру кода: в поиске узла URL:

$service_url = "http://mysite.com/drupal-folder/resttest/node/10.xml";

тогда как в функции входа в систему это:

$service_url = 'http://**www**.mysite.com/drupal-folder/rest/user/login.xml';

Я изменил его так, чтобы все URL -адреса указывали на www.mysite.com, и теперь я могу получить узел в качестве аутентифицированного пользователя.

Другие советы

Итак, вы говорите, что правильно вошли в систему как пользователя. Какой метод автоза автозаправления вы используете? Аутентификация сеанса? Если это так, ответ входа должен вернуть пользовательский объект, из которого вам нужно взять SessID, хранить его в своем приложении/другом веб -сайте/клиенте и использовать его всякий раз, когда вам нужно получить узел. Вы должны отправить Sessid в качестве другого параметра в вашем запросе на узел вместе с NID (да, каждый раз).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с drupal.stackexchange
scroll top