web-dev-qa-db-fra.com

Connectez-vous avec un service REST (module services)

Je travaille avec Drupal 7 (services 3.x) pour implémenter un service REST. Lorsque je teste une demande de connexion avec ce script:

$service_url = 'https://dev.mysite.org/api/blog/user/login.xml'; // .xml asks for xml data in response
$post_data = array(
  'username' => 'admin',
    'password' => 'admin',
    );
$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
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
// make the request
curl_setopt($curl, CURLOPT_VERBOSE, true); // output to command line
$response = curl_exec($curl);
curl_close($curl);
print "RESPONSE:\n";
var_dump($response);
// parse the response
$xml = new SimpleXMLElement($response);
$session_cookie = $xml->session_name .'='. $xml->sessid;
print "SESSION_COOKIE: $session_cookie";
file_put_contents('session_cookie.txt', $session_cookie);

Je reçois cette erreur:

* upload completely sent off: 29 out of 29 bytes
< HTTP/1.1 401 Unauthorized: Missing required argument name
< Date: Sun, 09 Feb 2014 02:39:45 GMT
* Server Apache/2.2.22 (Ubuntu) is not blacklisted
< Server: Apache/2.2.22 (Ubuntu)
< X-Powered-By: PHP/5.3.10-1ubuntu3.9
< Expires: Sun, 19 Nov 1978 05:00:00 GMT
< Last-Modified: Sun, 09 Feb 2014 02:39:45 +0000
< Cache-Control: no-cache, must-revalidate, post-check=0, pre-check=0
< ETag: "1391913585"
< Set-Cookie: DRUPAL_UID=-1; expires=Tue, 04-Mar-2014 06:13:05 GMT; path=/; domain=.dev.labdoo.org; secure
< Vary: Accept-Encoding
< Content-Length: 0
< Content-Type: text/html
< 
* Connection #0 to Host dev.mysite.org left intact
RESPONSE:
string(0) ""
PHP Fatal error:  Uncaught exception 'Exception' with message 'String could not be parsed as XML' in /home/myuser/Desktop/test.php:23
Stack trace:
#0 /home/myuser/Desktop/test.php(23): SimpleXMLElement->__construct('')
#1 {main}
  • Ma REST est:

enter image description here

enter image description here

enter image description here

  • J'ai suivi cet exemple pour tester le service .
  • Il est activé l'authentification de session dans le module Services.
  • Il est activé application/x-www-form-urlencoded, json, xml ....

[~ # ~] mise à jour [~ # ~]

Il semble que le code comporte plusieurs erreurs .... J'ai remplacé ma variable post_data pour cela:

$post_data = array(
  'name' => 'admin',
  'pass' => 'admin',
);

Et maintenant, j'envoie la demande de connexion correctement (je reçois une réponse 200), mais maintenant, j'essaie d'analyser le message de réponse pour obtenir la session de cookie, je ne reçois aucun message de réponse. Je reçois une erreur comme celle-ci:

* upload completely sent off: 21 out of 21 bytes
< HTTP/1.1 200 OK
< Date: Wed, 12 Feb 2014 21:35:36 GMT
* Server Apache/2.2.22 (Ubuntu) is not blacklisted
< Server: Apache/2.2.22 (Ubuntu)
< X-Powered-By: PHP/5.3.10-1ubuntu3.9
< Expires: Sun, 19 Nov 1978 05:00:00 GMT
< Last-Modified: Wed, 12 Feb 2014 21:35:36 +0000
< Cache-Control: no-cache, must-revalidate, post-check=0, pre-check=0
< ETag: "1392240936"
< Set-Cookie: DRUPAL_UID=-1; expires=Sat, 08-Mar-2014 01:08:56 GMT; path=/; domain=.dev.mysite.org; secure
< Content-Length: 1316
< Content-Type: application/xml
< 
* Connection #0 to Host dev.mysite.org left intact
RESPONSE:
string(1316) "
Fatal error: Unsupported operand types in /var/www/lbd/profiles/labdoo/modules/contrib/services/includes/services.runtime.inc on line 417

Call Stack:
    0.0000     334912   1. {main}() /var/www/lbd/index.php:0
    0.0347    4175712   2. menu_execute_active_handler() /var/www/lbd/index.php:21
    0.0348    4176376   3. call_user_func_array() /var/www/lbd/includes/menu.inc:517
    0.0348    4176756   4. services_endpoint_callback() /var/www/lbd/includes/menu.inc:517
    0.0366    4343036   5. call_user_func() /var/www/lbd/profiles/labdoo/modules/contrib/services/services.module:218
    0.0366    4343036   6. rest_server_server() /var/www/lbd/profiles/labdoo/modules/contrib/services/services.module:218
    0.0385    4449312   7. RESTServer->handle() /var/www/lbd/profiles/labdoo/modules/contrib/services/servers/rest_server/rest_server.module:39
    0.0432    4532668   8. services_controller_execute() /var/www/lbd/profiles/labdoo/modules/contrib/services/servers/rest_server/includes/RESTServer.inc:46
    0.0436    4534132   9. _services_controller_execute_internals() /var/www/lbd/profiles/labdoo/modules/contrib/services/includes/services.runtime.inc:106
    0.0436    4534176  10. _services_authenticate_user() /var/www/lbd/profiles/labdoo/modules/contrib/services/includes/services.runtime.inc:162

MISE À JOUR 2

J'essaie de créer un nouvel utilisateur pour vérifier si mon erreur est liée à l'utilisation d'un compte administrateur. J'ai essayé (maintenant avec le script postman pour Chrome) de créer un nouvel utilisateur via REST ... Ce serait facile ... mais je ne l'ai pas été (j'ai testé le nom d'utilisateur, le nom, l'email, le mail) ...enter image description here

5
carlos.baez

Enfin, j'ai résolu le problème. C'était un bug dans le module Services . J'ai mis à jour depuis 7.x-3.5 à la 7.x-3.7 version, j'ai suivi le tutoriel @sibiru et ça a commencé à bien fonctionner.

0
carlos.baez

C'est le bit important:

HTTP/1.1 401 non autorisé: nom d'argument requis manquant

Changez simplement votre charge utile en

$post_data = array(
  'name' => 'admin',
  'password' => 'admin',
);
2
Clive

Essayez de regarder ce screencast, cela m'a aidé

2
sibiru