web-dev-qa-db-ja.com

7.10サービス3およびREST

Drupalは初めてです。私の目標は、スタッフが自分のコンテンツを管理し、REST経由でノードから既存のパブリックWebサイトにコンテンツを取得することです。

Drupal 7.10、Services 3. Drupal=を使用すると、重要な場合、サイトルートではなく、サブディレクトリに存在します。「rest」という名前のエンドポイントが作成されました。 RESTサーバー。匿名アクセスは望ましくないため、認証されたアクセス要求用にDrupalユーザーが作成されました。

認証アクセス用にPHPクライアントに基づく MichaelColeによる投稿 を構築しています。RESTサーバーと通信しているようです、最初はDrupalサイトのテーマとDrupalエラーが私の一般的なPHP.

現時点では、サービスユーザーとしてログインしようとしているだけなので、login.phpコードだけがページで実行されています。

PHPはこれを返します:

応答:string(0) ""致命的なエラー:/path-to-my-page/test-drupal-rest.php:36のメッセージ「文字列をXMLとして解析できませんでした」を含むキャッチされない例外 'Exception'スタックトレース:# 0 /path-to-my-page/test-drupal-rest.php(36):SimpleXMLElement-> __ construct( '')#1 {main}が/ path-to-my-page/test-drupal-restにスローされました36行目の.php

36行目は:

$xml = new SimpleXMLElement($response);

完全なサービスURLをブラウザーに配置しただけの場合( http://www.mydomain.com/drupal-folder/rest/user/login.xml )は、ここに表示):

<? xml version = "1.0" encoding = "utf-8"?> <result />

アイデアが足りません。手伝ってくれますか?

編集/更新:[管理]"[構造]"[サービス]に移動し、リクエストの解析の下の "application/x-www-form-urlencoded"が無効になっていることを発見しました。これを有効にすると、リクエストが処理され始めました。ただし、ユーザー認証が明らかに認識されているにもかかわらず、ノードを取得できません。

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

編集/更新2012-01-16 15:10:これは、MichaelColeのコードに基づいた私の現在のコードで、ワークフローと目標に合わせて変更されています。ノードのコンテンツは取得しません。失敗は、ノード要求でのセッション認証の送信のどこかにあるようです。ログインは常に正しく機能し、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 />";
    }

LoginToDrupal()関数の後のデバッグ印刷呼び出しは、常に次のようなXMLを返します。

< ?xml version="1.0" encoding="utf-8"? >< result >< sessid >AU7yWNWPXxORI2DsdJVegdreg2F9rYQxy90dAB5px2s< /sessid >< session_name >SESSd9af11d86664849a8dcda2d6c4af3580< /session_name >< user >< uid >11< /uid >< name >myuser< /name >< mail >[email protected]< /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 >[email protected]< /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 >

明らかに成功したユーザーオブジェクトを返しますが、上記のコードはノードを取得しようとするたびに空のXML文字列を返します。

2
Paul S.

今日、私はサンプルコードに簡単な問題を発見しました。ノードの取得では、URLは次のとおりです。

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

一方、ログイン機能では次のようになります。

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

すべてのURLがwww.mysite.comを指すように変更し、認証されたユーザーとしてノードを取得できるようになりました。

1
Paul S.

つまり、ユーザーとして正しくログインしたということです。どの認証方法を使用していますか?セッション認証?その場合、ログインレスポンスはユーザーオブジェクトを返す必要があります。ユーザーオブジェクトからSESSIDを取得し、それをアプリケーション/他のWebサイト/クライアントに格納し、ノードを取得する必要があるときにいつでも使用できます。 SESSIDをnidと一緒にノード取得リクエストの別のパラメーターとして送信する必要があります(はい、毎回)。

0
rafaelcr