Domanda

Sono nuovo di Drupal. Il mio obiettivo è quello di usarlo per il personale per gestire i propri contenuti, quindi recuperare il loro contenuto dai nodi tramite REST al sito web pubblico esistente.

Uso Drupal 7.10, risiede Services 3. Drupal in una sottodirectory, non alla radice del sito, se quello che conta. Un endpoint denominata "riposo" è stato creato per il server REST. L'accesso anonimo non è auspicabile, in modo che un utente Drupal è stato creato per le richieste di accesso autenticati.

Sto costruendo un client PHP basato su un post di Michael Cole per autenticazione di accesso. Sembra di parlare con il server resto, come in un primo momento mi è stato vedere il nostro sito tema Drupal insieme ad un errore di Drupal nella mia pagina PHP generico.

In questo momento sto solo cercando di login come il mio utente del servizio, quindi basta il codice login.php è in esecuzione sulla mia pagina.

PHP sta tornando in questo modo:

Risposta: string (0) "" Fatal error: eccezione Uncaught 'Eccezione' con stringa di messaggio' non può essere analizzato come XML' in /path-to-my-page/test-drupal-rest.php:36 stack trace: # 0 / path-to-my-page / test- drupal-rest.php (36): SimpleXMLElement -> __ construct ( '') # 1 {main} gettato in / path-to-mio- Pagina / test-drupal-rest.php on line 36

Linea 36 è il seguente:

$xml = new SimpleXMLElement($response);

Se ho appena messo l'URL del servizio completo nel mio browser ( http: //www.mydomain.com/drupal-folder/rest/user/login.xml ), ottengo (XML rotto con spazi per la visualizzazione qui):

Sono a corto di idee. si può aiutare?

EDIT / UPDATE: sono andato in struttura amministrativa »» Servizi e scoperto che "/ x-www-form-urlencoded applicazione" sotto Richiesta di analisi è stato disattivato. Ho permesso che, e le mie richieste iniziato a passare attraverso. Tuttavia, anche se riconosce ovviamente la mia autenticazione utente, non riesco ancora a recuperare un nodo.

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

Modifica / Aggiornamento 2012-01-16 15:10: Ecco il mio codice attuale, basato sul codice di Michael Cole e modificato per il mio flusso di lavoro e obiettivo. Essa non recupera il contenuto del nodo. Il fallimento sembra essere da qualche parte nel invio della autenticazione della sessione con la richiesta nodo. Accesso in sempre funziona correttamente e ho sempre ricevere il mio oggetto utente 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 />";
    }

La chiamata di debug di stampa dopo la loginToDrupal () restituisce sempre XML in questo modo:

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

Anche se si ritorna chiaramente un oggetto utente con successo, il codice precedente restituisce una stringa XML vuoto ogni volta che cerco di recuperare il nodo.

È stato utile?

Soluzione

Oggi ho scoperto un problema semplice con il mio codice di esempio: Nel recupero del nodo, l'URL è:

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

, mentre nella funzione di login, che è:

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

ho cambiato in modo che tutti gli URL indicano www.mysite.com, e ora può recuperare un nodo come un utente autenticato.

Altri suggerimenti

Quindi stai dicendo che hai eseguito l'accesso come utente in modo corretto. Quale metodo di autenticazione stai usando? Sessione di autenticazione? In tal caso, la risposta di accesso dovrebbe restituire un oggetto utente, da cui è necessario prendere il SESSID, memorizzarlo sulla vostra applicazione / altro sito / cliente, e usarlo ogni volta che è necessario recuperare un nodo. È necessario inviare la SESSID come un altro parametro nel nodo recuperare richiesta a fianco del Nid (sì, ogni volta).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a drupal.stackexchange
scroll top