如何创建test_endpoint?


29

我是drupal的新手,并且正在使用用于REST和RESTWS模块的服务模块。我使用了RESTWS,并可以通过http://base_url/node/1.xml获取节点的内容, 现在我需要从外部PHP应用程序向drupal添加节点和用户。我在Google上搜索了一下,发现这里需要使用http:// base_drupal_url / drupal7 / test_endpoint / users。我试图从Drupal 7创建服务,但是我不知道在端点标题,名称和端点路径上应该给出什么,我想我需要在curl中提供相同的端点路径。

关于如何检查是否安装了REST Server以及如何创建端点路径的任何帮助将大有帮助。

我正在将Drupal 7与服务模块services-7.x-3.0-rc3一起使用


您解决问题了吗?我已经完全按照您的方式创建了端点和资源路径,但是却收到“找不到此服务器上未找到所请求的URL /〜DrupalWorkstation / Drupal / drupal_7_16 / rest / node”的消息。错误。请检查我对最高投票答案的评论。让我知道您是否对此有解决方案。
Raj Pawan Gumdal

Answers:


56

服务模块易于使用,但是配置起来可能很棘手,特别是如果您不熟悉此概念。因此,我将发布屏幕快照,以使“ Drupal Answers”用户可以轻松配置服务模块。

以下是我的计算机上安装的服务模块的版本:

在此处输入图片说明

创建一个名为“ rest”的端点,如下所示:

在此处输入图片说明

选择服务器的类型和端点路径:

在此处输入图片说明

选择要启用的资源列表并指定别名:

在此处输入图片说明

选择您要启用的响应格式化程序和请求解析器:

在此处输入图片说明

您可以如下所示测试配置:

在此处输入图片说明

您可以获取所有节点的列表,如下所示:

在此处输入图片说明

而具体的节点为:

在此处输入图片说明

以下是MichaelColehttp://drupal.org/node/910598#comment-4677738处提供的出色示例脚本,这些脚本可从任何外部PHP应用程序创建节点。

我正在复制他的代码以确保此答案的完整性。

//--------------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);

2
值得一提的是,他启用了每个请求解析选项。在意识到默认情况下禁用“ application / x-www-form-urlencoded”之前,我浪费了很多时间。
提请

我必须在哪里编写以上代码片段?它在模块/服务/服务器/ rest_server / lib中吗?
subhojit777

1
上面的代码@ subhojit777是一个独立的PHP代码段,可用于使用外部服务器上托管的服务api,您可以将其写入模块文件中,但可能将其写入modules / services / server / rest_server / lib中不是最好的地方。
Ajinkya库尔卡尼

正如您在本地主机上所说的,我已经设置了所有内容。我有一个drupal站点的路径,运行方式为:localhost /〜DrupalWorkstation / Drupal / drupal_7_16。当我点击上面的URL时,index.php页面正在运行,但是配置的端点和资源路径不起作用。我触发服务的URL是:localhost /〜DrupalWorkstation / Drupal / drupal_7_16 / rest / node。我收到以下错误:“在此服务器上找不到请求的URL /〜DrupalWorkstation / Drupal / drupal_7_16 / rest / node”。有关如何解决此问题的任何建议?
拉吉·帕万·冈达尔

1
Arigato gozaimasu Ajinkya老师。ARIGATO !!!
TheEYL

6

我建议您阅读为Services 3.x创建资源

另外,我要确保Services和RESTWS是否兼容。它们都提供同一事物的变体,因此可能会发生冲突。


我想知道我应该在drupal 7
sridhar 2011年

我应该在drupal中编写任何自定义代码来从我的php应用程序中创建一个节点吗?
sridhar 2011年

服务已经内置了可以使用的资源。有关RestWS和兼容性的信息:RestWS的服务移植了很多端口,但被RestWS维护者拒绝了。如果有人感兴趣,可以将其作为单独的模块发布。
VoxPelli 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.