Top / Redmine / REST

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);

   }

関連リンク


この記事は

選択肢 投票
おもしろかった 0  
そうでもない 0  

Top / Redmine / REST

現在のアクセス:3672


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2013-06-30 (日) 00:59:49 (2247d)