Pregunta

Soy nuevo en Drupal. Mi objetivo es usarlo para que el personal administre su propio contenido, luego recupere su contenido de los nodos a través de REST al sitio web público existente.

Uso de Drupal 7.10, Servicios 3. Drupal reside en un subdirectorio, no en la raíz del sitio, si eso importa. Se ha creado un punto final llamado "REST" para el servidor REST. El acceso anónimo no es deseable, por lo que se ha creado un usuario de Drupal para solicitudes de acceso autenticado.

Estoy construyendo un cliente PHP basado en Una publicación de Michaelcole Para el acceso a la autenticación. Parece estar hablando con el servidor REST, ya que al principio estaba viendo nuestro tema del sitio Drupal junto con un error de Drupal en mi página genérica de PHP.

En este momento solo estoy tratando de iniciar sesión como usuario de mi servicio, por lo que solo el código Login.php se ejecuta en mi página.

PHP está devolviendo esto:

Respuesta: cadena (0) "" Error fatal: excepción no capturada 'Excepción' con mensaje 'Cadena no se pudo analizar como XML' in /path-to-my-page/test-drupal-rest.php:36 Stack traza: # 0 /Path-to-My-Page /Test- Drupal-Rest.php (36): simpxmlelement-> __ constructo ('' ') #1 {main} lanzado en /rath-my- page /test-drupal-rest .php en la línea 36

La línea 36 es:

$xml = new SimpleXMLElement($response);

Si acabo de poner la URL de servicio completo en mi navegador ( http://www.mydomain.com/drupal-folder/rest/user/login.xml ), Obtengo (xml roto con espacios para mostrar aquí):

<? xml versión = "1.0" encoding = "utf-8"?> <result/>

Se me acabaron las ideas. ¿Puede usted ayudar?

Editar/Actualizar: Entré en servicios de administración »Estructura» y descubrí que "Application/X-WWW-Form-URLEncoded" bajo el análisis de solicitudes de solicitud se deshabilitó. Habilité eso y mis solicitudes comenzaron a pasar. Sin embargo, aunque obviamente reconoce mi autenticación de usuario, todavía no puedo recuperar un nodo.

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

Editar/Actualizar 2012-01-16 15:10: Aquí está mi código actual, basado en el código de Michaelcole y modificado para mi flujo de trabajo y objetivo. No recupera el contenido del nodo. La falla parece estar en algún lugar del envío de la autenticación de la sesión con la solicitud de nodo. Iniciar sesión siempre funciona correctamente y siempre recibo mi objeto de usuario 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 llamada de impresión de depuración después de la función logInToDrupal () siempre devuelve XML así:

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

Aunque claramente devuelve un objeto de usuario exitoso, el código anterior devuelve una cadena XML vacía cada vez que intento recuperar el nodo.

¿Fue útil?

Solución

Hoy descubrí un problema simple con mi código de muestra: en la recuperación del nodo, la URL es:

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

Mientras que en la función de inicio de sesión, es:

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

Lo cambié para que todas las URL apunten a www.mysite.com, y ahora puedo recuperar un nodo como usuario autenticado.

Otros consejos

Entonces estás diciendo que inició sesión como usuario correctamente. ¿Qué método de autenticación estás usando? ¿Autenticación de la sesión? Si es así, la respuesta de inicio de sesión debe devolver un objeto de usuario, desde el cual debe tomar el Sessid, almacenarlo en su aplicación/otro sitio web/cliente, y usarlo cuando necesite recuperar un nodo. Debe enviar el Sessid como otro parámetro en su solicitud de recuperación de nodo junto con el NID (sí, cada vez).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a drupal.stackexchange
scroll top