Как я могу использовать сервис drupal node.save с сайта, не являющегося друпалом? - PullRequest
2 голосов
/ 27 июля 2011

Я пытаюсь создать узел на друпальском сайте с неруспального сайта, но я не могу заставить его работать.

Это код, который я построил из поисков вокруг ...

<code>$domain = 'http://mydomain.com';
$operation = 'node.save';
$api_key = 'my api key';
$timestamp = (string) time();
$nonce = substr(md5(uniqid('s', true)), 0, 10);
$hash = hash_hmac('sha256', $timestamp .';'.$domain .';'. $nonce .';'.$operation, $api_key);

$node_data = array(
'type'        => 'story',
'title'       => 'test story title',
'body'        => 'test story text'
);

$send_data = array(
  'method' => $operation,
  'args' => array(
      'hash'              => $hash,
      'domain_name'       => $domain,
      'domain_time_stamp' => $timestamp,
      'nonce'             => $nonce,
      'node'              => serialize($node_data)
  )
);

$request = xmlrpc_encode_request($operation, $send_data);

$context = stream_context_create(
  array(
    'http' => array(
      'method' => "POST",
      'header' => "Content-Type: text/xml",
      'content' => $request
    )
  )
);

$retrieve = file_get_contents($domain .'/services/xmlrpc', false, $context);
$response = xmlrpc_decode($retrieve);

echo '<pre>'. htmlspecialchars(print_r($response, 1)) .'
';

но все, что я получаю от сервера: «Отсутствуют обязательные аргументы: узел», и я, черт возьми, пропускаю это дерьмо…

Я могу получить ответ "system.connect", который заставляет меня чувствовать себя хорошо, но это все, что я могу получить. В настройках моих служб не требуется указывать идентификатор_сессии.

Помоги мне переполниться стеком ... Ты моя единственная надежда

Ответы [ 2 ]

2 голосов
/ 18 ноября 2011

Если вы используете Службы 7.x-3.0-rc1 или выше, вы также можете использовать отличные примеры сценариев, предоставленные MichaelCole здесь http://drupal.org/node/910598#comment-4677738

Я снова документирую его код для пользователей StackOverflow.

 //--------------login to the server------------------------
$service_url = 'http://example.dev/rest/user/login.xml'; // .xml asks for xml data in response
$post_data = array(
    'username' => 'test',
    'password' => 'test',
);
$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 "LOGIN 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);

//----------------create a node -------------------------------

$node_data = array(
    'type' => 'ct_metadata_core',
    'title' => 'test layer',
    'field_core_lat_n[und][0]' => array('value' => '90'),
    'field_core_lat_s[und][0]' => array('value' => '-90'),
    'field_core_long_e[und][0]' => array('value' => '180'),
    'field_core_long_w[und][0]' => array('value' => '-180'),
    'field_core_description[und][0]' => array('value' => 'National Data Buoy Center'),
    'field_core_originator[und][0]' => array('value' => 'NDBC'),
    'field_core_url[und][0]' => array('url' => 'http://www.ndbc.noaa.gov/kml/marineobs_as_kml.php?sort=pgm'),
    'field_cont_res_name_org[und][0]' => array('value' => 'test'),

);


$service_url = 'http://example.dev/rest/node'; // .xml asks for xml data in response
$session_cookie = file_get_contents('session_cookie.txt');

$node_data = http_build_query($node_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_COOKIE, "$session_cookie"); // use the previously saved session

curl_setopt($curl, CURLOPT_POST, true);             // do a POST
curl_setopt($curl, CURLOPT_POSTFIELDS, $node_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 "CREATE NODE RESPONSE:\n";
var_dump($response);


//----------------logout from the server-------------------------

$service_url = 'http://example.dev/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 "LOGOUT RESPONSE:\n";
var_dump($response);
0 голосов
/ 01 августа 2011

Кажется, вам нужно использовать sessionid.Нажмите метод system.connect, который возвращает идентификатор сеанса, а затем передайте его как параметр в node.save

...