7.10 Obtenir nœud en tant que utilisateur autorisé via les services 3 et REST

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

  •  22-10-2019
  •  | 
  •  

Question

Je suis nouveau à Drupal. Mon objectif est de l'utiliser pour le personnel pour gérer leur propre contenu, puis récupérer leur contenu à partir des nœuds via REST sur le site Web public existant.

Utilisation de Drupal 7.10, Services 3. Drupal réside dans un sous-répertoire, pas à la racine du site, si cette question. Un noeud final nommé « repos » a été créé pour le serveur REST. L'accès anonyme n'est pas souhaitable, de sorte qu'un utilisateur Drupal a été créé pour les demandes d'accès authentifiées.

Je construis un client PHP basé sur un message par Michael Coulthard pour auth accès. Il semble parler au serveur REST, au début, je voir notre thème du site Drupal avec une erreur Drupal dans ma page PHP générique.

A ce moment, je n'essaie de se connecter en tant mon utilisateur de service, de sorte que le code login.php fonctionne sur ma page.

PHP retourne ceci:

RÉPONSE: string (0) "" Erreur fatale: Uncaught exception « Exception » message « chaîne ne peut pas être interprétée comme XML » dans /path-to-my-page/test-drupal-rest.php:36 trace Stack: # 0 / chemin à ma page / test- -rest.php drupal (36): SimpleXMLElement -> __ construct ( '') # 1 {main} jeté / path-to-my- Page / test-rest.php-sur drupal ligne 36

Ligne 36 est:

$xml = new SimpleXMLElement($response);

Si je viens de mettre l'URL complète de service dans mon navigateur ( http: //www.mydomain.com/drupal-folder/rest/user/login.xml ), je reçois (XML cassé avec des espaces pour l'affichage ici):

Je suis d'idées. Pouvez-vous aider?

EDIT / UPDATE: Je suis entré dans l'administration de structure »Services et découvert que "application / x-www-form-urlencoded" sur demande Parsing a été désactivé. Je permis que, et mes demandes commencé à passer par. Cependant, même si elle reconnaît évidemment mon auth utilisateur, je ne peux toujours pas récupérer un nœud.

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

Modifier / Mise à jour 2012-01-16 15:10: Voici mon code actuel, basé sur le code et modifié pour Michael Coulthard mon flux de travail et le but. Il ne récupère pas le contenu du nœud. L'échec semble être quelque part dans l'envoi de l'authentification de la session à la demande de noeud. Connexion à toujours fonctionne correctement et je reçois toujours mon objet utilisateur 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 />";
    }

L'appel d'impression de débogage après la fonction loginToDrupal () retourne toujours XML comme ceci:

< ?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 >

Même si elle renvoie clairement un objet utilisateur réussi, le code ci-dessus renvoie une chaîne XML vide chaque fois que je tente de récupérer le nœud.

Était-ce utile?

La solution

Aujourd'hui, je découvre un simple problème avec mon exemple de code: Dans la recherche de nœud, l'URL est:

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

alors que dans la fonction de connexion, il est:

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

je l'ai changé de sorte que toutes les URL pointent vers www.mysite.com, et je peux maintenant récupérer un nœud en tant qu'utilisateur authentifié.

Autres conseils

Alors, vous dites que vous vous êtes connecté en tant qu'utilisateur correctement. Quelle méthode auth utilisez-vous? Session d'authentification? Dans ce cas, la réponse de connexion doit retourner un objet utilisateur, à partir duquel vous devez prendre le SESSID, le stocker sur votre application / site autre / client et l'utiliser chaque fois que vous devez récupérer un nœud. Vous devez envoyer le SESSID comme un autre paramètre dans votre noeud récupérer demande à côté du JNV (oui, à chaque fois).

Licencié sous: CC-BY-SA avec attribution
Non affilié à drupal.stackexchange
scroll top