2010年11月20日土曜日

Evernote API を使ってみる (4) ノート作成・取得・更新・削除

ノートを作成・取得・更新・削除するには、基本的にはノートブックの場合と一緒でNoteStoreサービスのメソッド(プロシージャ)をコールすればよい。削除(delete)は本当にデータを削除するわけではなく、Inactiveフラグを立てる(Evernoteサイトやデスクトップアプリでいう、Trashへ移動された状態)だけなので注意。データ自体を削除するには、expungeNotes()などを使う。

ノート作成・取得・更新・削除を行うテストプログラム。
  1. public class NoteTest {  
  2.   
  3.     private static String consumerKey = "consumer key";  
  4.     private static String consumerSecret = "consumer secret";  
  5.     private static String evernoteHost = "sandbox.evernote.com";  
  6.     private static String userName = "user name";  
  7.     private static String password = "password";  
  8.   
  9.     private static NoteStore.Client setupNoteStore(String evernoteHost, User user) throws TException {  
  10.         // NoteStore クライアントのセットアップ  
  11.         String noteStoreUrl = "https://" + evernoteHost + "/edam/note/" + user.getShardId();  
  12.         THttpClient trans = new THttpClient(noteStoreUrl);  
  13.         TBinaryProtocol prot = new TBinaryProtocol(trans);  
  14.         NoteStore.Client noteStore = new NoteStore.Client(prot, prot);  
  15.         return noteStore;  
  16.     }  
  17.   
  18.     public static void main(String[] args) {  
  19.         UserStore.Client userStore = null;  
  20.         NoteStore.Client noteStore = null;  
  21.         AuthenticationResult authResult = null;  
  22.         try {  
  23.             userStore = AuthUtil.setupUserStore(evernoteHost);  
  24.             authResult = AuthUtil.authenticate(userStore, consumerKey, consumerSecret, evernoteHost, userName, password);  
  25.             User user = authResult.getUser();  
  26.             String authToken = authResult.getAuthenticationToken();  
  27.               
  28.             noteStore = setupNoteStore(evernoteHost, user);  
  29.               
  30.             Notebook notebook = noteStore.getDefaultNotebook(authToken);  
  31.               
  32.             // 新規ノート作成  
  33.             System.out.println("** CREATE **");  
  34.             Note note1 = new Note();  
  35.             note1.setTitle("testnote1");  
  36.             String content = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"  
  37.                 + "<!DOCTYPE en-note SYSTEM \"http://xml.evernote.com/pub/enml.dtd\">"  
  38.                 + "<en-note>Hello Evernote.</en-note>";  
  39.             note1.setContent(content);  
  40.             note1.setNotebookGuid(notebook.getGuid());  
  41.             Note created1 = noteStore.createNote(authToken, note1);  
  42.             System.out.println("ノート \"" + created1.getTitle() + "\" が作成されました。(guid=" + created1.getGuid() + ")");  
  43.             Note note2 = new Note();  
  44.             note2.setTitle("testnote2");  
  45.             note2.setContent(content);  
  46.             note2.setNotebookGuid(notebook.getGuid());  
  47.             Note created2 = noteStore.createNote(authToken, note2);  
  48.             System.out.println("ノート \"" + created2.getTitle() + "\" が作成されました。(guid=" + created1.getGuid() + ")");  
  49.               
  50.             // ノート取得  
  51.             System.out.println("** GET **");  
  52.             Note note1_1 = noteStore.getNote(authToken, created1.getGuid(), truefalsefalsefalse);  
  53.             System.out.println("ノート \"" + note1_1.getTitle() + "\" を取得しました。(Update Sequence Number: " + note1_1.getUpdateSequenceNum() + ")");  
  54.             System.out.println("コンテンツ: " + note1_1.getContent());  
  55.               
  56.             // ノート更新  
  57.             System.out.println("** UPDATE **");  
  58.             String content2 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"  
  59.                 + "<!DOCTYPE en-note SYSTEM \"http://xml.evernote.com/pub/enml.dtd\">"  
  60.                 + "<en-note>My First Note.</en-note>";  
  61.             note1_1.setContent(content2);  
  62.             noteStore.updateNote(authToken, note1_1);  
  63.             Note updated = noteStore.getNote(authToken, note1_1.getGuid(), truefalsefalsefalse);  
  64.             System.out.println("ノート \"" + updated.getTitle() + "\" を更新しました。(Update Sequence Number: " + updated.getUpdateSequenceNum() + ")");  
  65.             System.out.println("コンテンツ: " + updated.getContent());  
  66.               
  67.             // ノート削除 (Trashに移動)  
  68.             System.out.println("** DELETE **");  
  69.             int usn = noteStore.deleteNote(authToken, created2.getGuid());  
  70.             System.out.println("ノート\"" + created2.getTitle() + "\"が削除されました。");  
  71.               
  72.             // ノートリストを取得  
  73.             System.out.println("** FIND **");  
  74.             NoteFilter filter = new NoteFilter();  
  75.             filter.setNotebookGuid(notebook.getGuid());  
  76.             NoteList noteList = noteStore.findNotes(authToken, filter, 0100);  
  77.             List<Note> notes = noteList.getNotes();  
  78.             System.out.println("(Active Notes)");  
  79.             for (Note note : notes) {  
  80.                 System.out.println(" - " + note.getTitle());  
  81.             }  
  82.               
  83.             // Trashに移動されたノートリストを取得  
  84.             filter.setInactive(true);  
  85.             NoteList noteList2 = noteStore.findNotes(authToken, filter, 0100);  
  86.             List<Note> notes2 = noteList2.getNotes();  
  87.             System.out.println("(Inactive Notes)");  
  88.             for (Note note : notes2) {  
  89.                 System.out.println(" - " + note.getTitle());  
  90.             }  
  91.   
  92.         } catch (Exception e) {  
  93.             e.printStackTrace();  
  94.         }  
  95.   
  96.     }  
  97.   
  98. }  

実行例。
** CREATE **
ノート "testnote1" が作成されました。(guid=19ebdb55-c36b-47b5-8ce6-7ef9474b79aa)
ノート "testnote2" が作成されました。(guid=19ebdb55-c36b-47b5-8ce6-7ef9474b79aa)
** GET **
ノート "testnote1" を取得しました。(Update Sequence Number: 201)
コンテンツ: Hello Evernote.
** UPDATE **
ノート "testnote1" を更新しました。(Update Sequence Number: 203)
コンテンツ: My First Note.
** DELETE **
ノート"testnote2"が削除されました。
** FIND **
(Active Notes)
 - testnote1
(Inactive Notes)
 - testnote2

ノートのコンテンツは、Evernote Markup Language (ENML) で厳密に記述する必要がある(DTDがここ)。保存前にバリデーションがかかり、妥当なXMLでなければはじかれてしまうため、DOMなりのツールを使ってきちんと構築しないといけない。

ノートブックや、他のタイプでもそうなのだけれど、特定のオブジェクトを指定する場合にGUIDを指定しないといけないのがけっこう面倒くさい&通信が多くなる(ノートの場合はGUID以外に一意に特定できる属性がないから仕方ないけれど)。実際、アプリを作ろうという場合はGUIDをメモリなりにキャッシュしておくレイヤーをかぶせるのだと思う。

0 件のコメント:

コメントを投稿