Trac に HttpWebRequest で接続するときは、UserAgent を設定する
http://www.moonmile.net/blog/archives/2679
の続き。C# から XML-RPC で接続するので、http://www.xml-rpc.net/ を使いました。なんとなくオーバーヘッドが多そうなので気になるところですが、wordpress の post ツールを作ったことなので、その流用も兼ねて利用します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | public class TracTools { public _Setting Setting { get ; set ; } public class _Setting { public string UserName { get ; set ; } public string Password { get ; set ; } public string Url { get ; set ; } } public TracTools() { this .Setting = new _Setting(); } /// <summary> /// プロキシを作成する /// </summary> /// <returns></returns> private ITrac CreateProxy() { ITrac proxy = CookComputing.XmlRpc.XmlRpcProxyGen.Create<ITrac>(); proxy.Url = this .Setting.Url; proxy.UserAgent = "trac-tools" ; proxy.Credentials = new NetworkCredential( Setting.UserName, Setting.Password); return proxy; } /// <summary> /// api をリストアップ /// </summary> /// <returns></returns> public List< string > ListMethods() { //プロキシクラスのインスタンスを作成 ITrac proxy = CreateProxy(); string [] res = proxy.SystemListMethods(); List< string > lst = res.ToList< string >(); return lst; } } |
実際は、下記のようなプロキシのクラスを作るのですが、api をリストアップするメソッドは、既に IXmlRpcProxy インターフェース内で SystemListMethods として定義済みなので、このまま使います。xml-rpc で「system.listMethods」として呼び出されます。
1 2 3 4 5 6 7 8 9 10 11 | public interface ITrac : IXmlRpcProxy { [XmlRpcMethod( "ticket.get" )] object [] TicketGet( int id); [XmlRpcMethod( "ticket.create" )] int TicketCreate( string summary, string desc, XmlRpcStruct attrs); [XmlRpcMethod( "ticket.update" )] object [] TicketUpdate( int id, string comment, XmlRpcStruct attrs); [XmlRpcMethod( "ticket.getActions" )] object [] TicketGetActions( int id); } |
ダイジェスト認証を使う場合は、プロキシの Credentials プロパティに情報を設定します。
呼出はこんな感じ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | static void Main( string [] args) { TracTools trac = new TracTools(); trac.Setting.Url = "http://localhost:8000/trac/gokui-ios5/login/rpc" ; trac.Setting.UserName = "masuda" ; trac.Setting.Password = "masuda" ; if (args.Length == 0) { Usage(); return ; } else { switch (args[0]) { case "apilist" : List< string > lst = trac.ListMethods(); foreach ( string name in lst) { Console.WriteLine(name); } } } |
■実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | D:\work\blog\src\trac\TracTools\TracPost\bin\Debug>tracpost apilist system.multicall system.listMethods system.methodHelp system.methodSignature system.getAPIVersion ticket.query ticket.getRecentChanges ticket.getAvailableActions ticket.getActions ticket. get ticket.create ticket.update ticket.delete ticket.changeLog ticket.listAttachments ticket.getAttachment ticket.putAttachment ticket.deleteAttachment ticket.getTicketFields ticket.status.getAll ticket.status. get ticket.status.delete ticket.status.create ticket.status.update ticket.component.getAll ticket.component. get ticket.component.delete ticket.component.create ticket.component.update ticket.version.getAll ticket.version. get ticket.version.delete ticket.version.create ticket.version.update ticket.milestone.getAll ticket.milestone. get ticket.milestone.delete ticket.milestone.create ticket.milestone.update ticket.type.getAll ticket.type. get ticket.type.delete ticket.type.create ticket.type.update ticket.resolution.getAll ticket.resolution. get ticket.resolution.delete ticket.resolution.create ticket.resolution.update ticket.priority.getAll ticket.priority. get ticket.priority.delete ticket.priority.create ticket.priority.update ticket.severity.getAll ticket.severity. get ticket.severity.delete ticket.severity.create ticket.severity.update wiki.getRecentChanges wiki.getRPCVersionSupported wiki.getPage wiki.getPageVersion wiki.getPageHTML wiki.getPageHTMLVersion wiki.getAllPages wiki.getPageInfo wiki.getPageInfoVersion wiki.putPage wiki.listAttachments wiki.getAttachment wiki.putAttachment wiki.putAttachmentEx wiki.deletePage wiki.deleteAttachment wiki.listLinks wiki.wikiToHtml search.getSearchFilters search.performSearch D:\work\blog\src\trac\TracTools\TracPost\bin\Debug> |
ひとまず、Trac に xml-rpc 経由で問合せができるところまで確認OKと。