先日のアップから間が空きましたが・・・仕事の方が忙しくて結構時間掛かったんですよ?
で先日はOneDriveのルートディレクトリを取得するところまで書きましたが・・・
では、そのデータの解体から始めましょう。
受信するのは先述の通りテキスト形式のJSONと言うものです。
で、これが・・・まぁ、色々と面倒なんですよ?
専用の形式であるため、自分で解読するしか無い様な雰囲気です。
まぁ、複雑な書式では無いので、1行ずつ読んでも良いですが、面倒なことこの上ありません。
そこで、.netの3.5とか4あたりからはこれのデコーダーが付録されています。
JsonReaderWriterFactory
と言うものですね。
しかも、これがやっかい、XML形式で返答するという物。
そこであたしのお勧めはこちら、
System.Net.WebClient wc = new System.Net.WebClient(); //WebClient作成
System.Xml.XmlDocument xDoc = new System.Xml.XmlDocument(); //出力用のXMLドキュメント
Byte[] dat = wc.DownloadData(URL); //バイナリ形式で戻り値を取得
System.Xml.XmlDictionaryReader xdr = System.Runtime.Serialization.Json.JsonReaderWriterFactory.CreateJsonReader(dat, System.Xml.XmlDictionaryReaderQuotas.Max); //リーダーに掛ける
xdr.Read();//ルートオブジェクトの読み込み
xDoc.LoadXml(xdr.ReadOuterXml());//変換済みのXMLソースをXmlドキュメントに流し込む
あとはxDocを一般的なxmlとして処理すれば、問題なくOK
所で、これで取得するのは、ルートディレクトリの情報です。
これを取得しただけでは何も出来ません。
操作したい対象のフィルだを開いて、ファイルをダウンロードする、アップロードする、 そう言った事をしないといけません。
じゃぁ、目的のフォルダを取得するにはどうしたら良いでしょうか?
じゃぁ、
https://apis.live.net/v5.0/me/skydrive?
とやったところを
https://apis.live.net/v5.0/me/skydrive/フォルダ1/フォルダ2?
と殺れば出てくるでしょうか??
答えはノーです。
実際のフォルダは全て数字名になっているので、この方法では取得出来ません。
そこで利用するのが「upload_location」タグです。
これは、下位層の情報が含まれている場所へのリンクが格納されています。
(注:これ以降の情報はJSON形式がXML形式になったものです。)
<upload_location type="string">https://apis.live.net/v5.0/folder.xxxxxxxxxxxxxxxxxxx/files/</upload_location>
これをダウンロードすることで、フォルダの中身一覧が取得出来、その中から希望するフォルダの情報を取得することになります。
ちなみに、
upload_location以外の情報源として、<id type="string">folder.xxxxxxx</id>があります。
https://apis.live.net/v5.0/に idタグの中身を貼り付けることでフォルダその物にアクセス出来ます。
さらにその後ろに/files/を付けることで、フォルダの中のファイルの一覧を取得出来ます。
なお、ファイルの一覧と言っていますが、ファイルやらフォルダがすべて混ざって値が返ってくるので、
<type type="string">folder</type>または<type type="string">album</type>で、<name type="string">フォルダ名</name>が探しているフォルダ名かどうかを確認することで、確定出来ます。
また、ファイルの場合は
<id type="string">file.xxxxxxxx</id>
と、idの先頭もfileになり、
upload_locationの後ろもfilesからcontentに変わり、これを取得することで、多分ダウンロードすることになります。
<upload_location type="string">https://apis.live.net/v5.0/file.xxxxxxxxxxxxxx/content/</upload_location>
ってことで、/フォルダ1/フォルダ2を取得するには、
1.ルートディレクトリの情報を取得する。
2.ルートディレクトリのファイル一覧を取得する。
3.フォルダ1の情報を探す
4.フォルダ1のファイル一覧を取得する。
5.フォルダ2の情報を探す。
6.フォルダ2のファイル一覧を取得する。
といった方法をとる必要があるようです。
ちなみに注意事項ですが・・・・
ファイル一覧に表示されているフォルダの情報は当該フォルダのファイル一覧へのリンクしか保持していません。
フォルダその物の情報が必要な場合は、upload_locationを使う場合は、/files/を消してからデータの取得をするか、
idを用いるか、どちらかと言うことに成ります。
なぜフォルダの情報が必要なのでしょうか?
ある程度の情報なら、わざわざ取得しなくても分かるのでは無いかと言うことですが・・・・
じつはこれ、それなりに重要なのです。
フォルダの新規作成は、フォルダに対して行うので/files/や/content/が付いている状態で行っても、成功しません。
それと、
新規作成したフォルダは、当然中身がありません。
中身の一覧を返す/files/では中身が無い状態では、ほぼ情報を返しません。
<root type=\"object\"><data type=\"array\"></data></root>
これだけですね。
なので、フォルダの情報とフォルダのリスト情報をペアで保存しておかなければ前後不覚に陥ります。
基本的には、ディレクトリ階層のフォルダのidを全部保存しておく必要があるでしょう。
他に使うのであれば、日付などの情報も、予め抜いておくと良いでしょう。
せっかくのXML形式なのでそのまま取っておけば、便利かもしれません。
でも、必要な情報だけを保持した、構造体とかにしておくのも一つの手ですね☆
ちなみに、データが一つでもあれば、
<parent_id type="string">folder.xxxxxxxx</parent_id>
で、前のフォルダ情報が分かります。
不便です。
ちなみに、フォルダの作成方法ですが・・・・
フォルダを作成するフォルダのidに対して、
https://apis.live.net/v5.0/folder.xxxxxxxxxxxxxx?access_token=xxxxxxxx
{name:"フォルダ1"}
をデータで送ります。
wc.Headers["Content-Type"] = "application/json";
にする必要があります。
|