// 下階層用テンプレート
#topicpath

----
//ここにコンテンツを記述します。
#contents

RedmineにはデータにアクセスするためのREST APIが備わっています。
[[Rest api - Redmine>http://www.redmine.org/projects/redmine/wiki/Rest_api]] これです。
RedmineのWikiを解析したくって、これを使ってみました。

ちなみに上記のサイトによると、WikiへアクセスするREST APIはRedmine Ver.2.2からだそうですね。

**やってみる [#db66f4fa]
REST APIへアクセスするライブラリとして [[Jersey>https://jersey.java.net/]] をつかうことにします。
JerseyはJavaでRESTfullなAPIにアクセスするためのライブラリです。


**プロジェクトの作成 [#b479fe39]
いろいろ準備するのは大変なので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をとる [#w666968f]
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ページを取得する [#oac658de]
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を更新する [#dbea1fc6]
つぎに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 と Apache Tomcat を使って RESTful な Web サービスを作成する>http://www.ibm.com/developerworks/jp/web/library/wa-aj-tomcat/]]

このページを見た感じだと、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);
 
    }


**関連リンク [#xd929836]
-[[[Examples] Index of /trunk/JerseyExamples>http://www.masatom.in/viewvc/Examples/trunk/JerseyExamples/]]
-[[Rest api - Redmine>http://www.redmine.org/projects/redmine/wiki/Rest_api]]
[[Jerseyで、Restのファイルアップロード - クロノスの雪山とIT技術日記>http://d.hatena.ne.jp/chronos_devel/20110930/1317394234]]
-[[HTTPクライアントとして使うjersey-client - Akira Koyasu's WebLog>http://www.akirakoyasu.net/2012/02/05/jerey-client-useful-http-client/]]
-[[Jersey と Apache Tomcat を使って RESTful な Web サービスを作成する>http://www.ibm.com/developerworks/jp/web/library/wa-aj-tomcat/]]
-[[Jersey>https://jersey.java.net/]] 
-[[JSON整形サービス>http://www.ctrlshift.net/jsonprettyprinter/]]
-[[maven - How do I migrate from Jersey 1.0 to Jersey 2.0? - Stack Overflow>http://stackoverflow.com/questions/17098341/how-do-i-migrate-from-jersey-1-0-to-jersey-2-0]] jerseyのバージョンが上がって、標準APIみたくなってる??



----
この記事は
#vote(おもしろかった,そうでもない)

#comment
#topicpath


SIZE(10){現在のアクセス:&counter;}

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS