RedmineにはデータにアクセスするためのREST APIが備わっています。 Rest api - Redmine これです。 RedmineのWikiを解析したくって、これを使ってみました。 ちなみに上記のサイトによると、WikiへアクセスするREST APIはRedmine Ver.2.2からだそうですね。 やってみる †REST APIへアクセスするライブラリとして Jersey をつかうことにします。 JerseyはJavaでRESTfullなAPIにアクセスするためのライブラリです。 プロジェクトの作成 †いろいろ準備するのは大変なのでMavenでプロジェクトをつくることにします。pom.xmlはこんな感じ。 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>nu.mine.kino</groupId> <artifactId>JerseyExamples</artifactId> <version>0.0.1-SNAPSHOT</version> <dependencies> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-core</artifactId> <version>1.17.1</version> </dependency> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-client</artifactId> <version>1.17.1</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> </dependency> </dependencies> </project> まずはIndexをとる †Wikiページの一覧を取得するREST APIは http://www.redmine.org/projects/redmine/wiki/Rest_WikiPages によると GET /projects/foo/wiki/index.xml や GET /projects/foo/wiki/index.json だそうです。Jerseyでアクセスしてみます。 @Test public void wikiIndex() { String url = redmineHost + "projects/" + projectKey + "/wiki/index.json?key=" + apiAccessKey; Client client = Client.create(); WebResource resource = client.resource(url); ClientResponse getResponse = resource.get(ClientResponse.class); String responseStr = getResponse.getEntity(String.class); System.out.println(responseStr); } 結果は以下の通り。 { "wiki_pages": [ { "created_on": "2013-06-15T01:37:35Z", "title": "Wiki", "updated_on": "2013-06-15T10:37:35+09:00", "version": 1 } ]} 「Wiki」というタイトルのページが存在することが分かりました。RedmineのWikiのキーはタイトルなので、つぎはタイトルをつかって本体を取得します。 タイトルを指定してWikiページを取得する †Wikiページの一覧を取得するREST APIは http://www.redmine.org/projects/redmine/wiki/Rest_WikiPages によると GET /projects/foo/wiki/[title].xml や GET /projects/foo/wiki/[title].json だそうです。Jerseyでアクセスしてみます。 @Test public void wikiDetail() { String title = "Wiki"; String url = redmineHost + "projects/" + projectKey + "/wiki/" + title + ".json?key=" + apiAccessKey; Client client = Client.create(); WebResource resource = client.resource(url); ClientResponse getResponse = resource.get(ClientResponse.class); String responseStr = getResponse.getEntity(String.class); System.out.println(responseStr); } 結果は以下の通り。 {"wiki_page": { "author": { "id": 3, "name": "hogehoge" }, "comments": "", "created_on": "2013-06-15T01:37:35Z", "text": "h1. Wiki", "title": "Wiki", "updated_on": "2013-06-15T01:37:35Z", "version": 1 }} "text" のところがWikiの本文です。属性情報も含めて簡単にコンテンツを取得することが出来ました。 Wikiを更新する †つぎにWikiを新規作成・更新してみます。Jerseyでデータをアップロードするにはどうするのかなって調べてみました。 ちなみに http://www.redmine.org/projects/redmine/wiki/Rest_WikiPages では、 PUT /projects/foo/wiki/UsersGuide.xml <?xml version="1.0"?> <wiki_page> <text>Example</text> <comments>Typo</comments> </wiki_page> のようにWikiの情報をxmlでHTTP PUTするAPIになっています。そして このページを見た感じだと、JerseyでデータをPutするには @XmlRootElement(name = "wiki_page") public class WikiPage implements Serializable { private String text; public String getText() { return text; } public void setText(String text) { this.text = text; } } このようにAnnotationされたオブジェクトを使って下記のようにPutすればいいようです。 @Test public void wikiUpdate() throws UnsupportedEncodingException { WikiPage wikiPage = new WikiPage(); wikiPage.setText("updte text"); String title = "NewWiki"; // HTTP Putはいまのところxmlで稼動確認した。xmlのRESTにput String url = redmineHost + "projects/" + projectKey + "/wiki/" + URLEncoder.encode(title, "UTF-8") + ".xml?key=" + apiAccessKey; Client c = Client.create(); WebResource r = c.resource(url); ClientResponse response = r.accept(MediaType.APPLICATION_XML).put( ClientResponse.class, wikiPage); } 関連リンク †
この記事は 現在のアクセス:5898 |