7.10取得のノードとして認可ユーザ経由でサービス3休
質問
私は新しいシステムを変更.私の目標は、ご利用いたスタッフ管理、その内容を取得するコンテンツからのノードの既存の公共。
使用Drupal7.10、サービス3.Drupalに存在するサブディレクトリではなく、サイトのルートの場合を始めとしたブースがあります。エンドポイントの名前を"していただくために作成されたもので、残ります。匿名アクセスすることが望ましいと言えまで、システムを変更ユーザーが作成されたために認証されたアクセスします。
構築を行っているPHPのクライアントに基づく ポストによるMichaelCole たauthます。それはサーバーとして最初に私たちを見てくだサイトをテーマに沿ってDrupalエラマリPHPのページです。
この時間のみにしようとしてログインする私のサービスのユーザので、login.php コードを実行してください。
PHPはこの:
応答:文字列(0)"" 致命的なエラー:キャッチされない例外'例外とのメッセージ'文字列を解析できなかったとして XMLにパスをマイページ-試験-だ-ます。php:36のスタックトレース:#0/パスへのマイページ-試験- drupal-rest.php(36):SimpleXMLElement->__構築(")#1{main}投げ入れられることで/path to my- ページ/test-drupal-rest.php ラ36
線36:
$xml = new SimpleXMLElement($response);
まだ、フルサービスURLの私にはブラウザ http://www.mydomain.com/drupal-folder/rest/user/login.xml )、Get(XML破損とスペースの表示はこちら):
< ?xml version="1.0"encoding="utf-8"?> < 結果/>
私の考えます。できますか?
編集-更新また管理"構造"のサービス発見された"application/x-www-form-urlencoded"の求解析ができないようにしました。うことで、自分の要求を行っています。しかし、も明らかに認識し、私のユーザー authたことがきっかけで、今でもない取得などのノードです。
=====================
編集-更新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 >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 >
でも明を返しますユーザオブジェクトの成功は、上記コードを返す空のXML文字列でみを取得するノードです。
解決
今日、私はサンプルコードで簡単な問題を発見しました。ノード取得では、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を指すように変更しました。これで、認証されたユーザーとしてノードを取得できるようになりました。
他のヒント
だから、あなたはユーザーとして正しくログインしたと言っています。どのAUTHメソッドを使用していますか?セッション認証?その場合、ログイン応答はユーザーオブジェクトを返す必要があります。ユーザーオブジェクトは、SESSIDを取得し、アプリケーション/その他のWebサイト/クライアントに保存し、ノードを取得する必要があるときにいつでも使用する必要があります。 NIDと一緒にノード取得要求の別のパラメーターとしてSessidを送信する必要があります(はい、毎回)。