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);
}
この記事は
現在のアクセス:6447