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>
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ページの一覧を取得する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を新規作成・更新してみます。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); }
この記事は
現在のアクセス:6241