読者です 読者をやめる 読者になる 読者になる

GroovyからBacklog API(XML-RPC)を叩いてみる

J選抜でのカズのゴール&カズダンスに感動して、息子のミドルネームに「キングカズ」と名付けられないかと考えているikikkoです。こんにちは。あのゴールシーンを見ていない方は、↓から御覧ください。そのうち、日本国民としての教養として小学校の教科書にも入るんじゃないでしょうか。


背景

BacklogにはXML-RPCベースのAPIがあります。

なんですが、XML-RPCと(Javaのような)静的型付けはあまり相性がよくないんです*1。特に、仕様上まわりがMapとなってスマートに扱えない。このへんは動的型付けの方が扱いやすそう。

というわけで、いつもどおりGroovyからBacklog APIを叩いてみました。

Groovy

定義が必要なライブラリはとりあえず2つ。GMavenを使ったので、POM形式です。groovy-xmlrpcにsmackが依存定義されているのですが、POMに定義されているバージョンがセントラルリポジトリに入っていないので、明示的に追加しています。

<dependency>
	<groupId>org.codehaus.groovy</groupId>
	<artifactId>groovy-xmlrpc</artifactId>
	<version>0.7</version>
</dependency>
<dependency>
	<groupId>jivesoftware</groupId>
	<artifactId>smack</artifactId>
	<version>3.1.0</version>
</dependency>

実際のコードは↓な感じですね。

static def SPACE = 'demo'
static def USER_ID = 'demo'
static def PASSWORD = 'demo'
static def PROJECT = 'STWK'

def proxy

@Before
void setUp() {
	proxy = new XMLRPCServerProxy("https://${SPACE}.backlog.jp/XML-RPC")
	proxy.setBasicAuth(USER_ID, PASSWORD)
}

@Test
public void getProjects() {
	proxy.backlog.getProjects().each{ println it }
}

@Test
public void createIssue() {
	def project = proxy.backlog.getProject(PROJECT)

	def issue = proxy.backlog.createIssue([
		projectId: project.id,
		summary: 'groovy xml-rpc test'
	])
	println "${issue.key} : ${issue.url}"
}
Java

ちなみに、JavaでcreateIssue()をやろうとすると、こんな感じ。JavaXML-RPCライブラリはApache XML-RPCがあります。冒頭でちょっと触れたけど、これがあまりイケテナイ。リクエスト・レスポンスともパラメータをMapやObject型で扱うので、いちいちキャストとかが必要なんですよね。コードをみたときに、本質的な処理が分かりづらい。

Map<String, Object> request = new HashMap<String, Object>();
request.put("projectId", "project.getId()");
request.put("summary", "java xml-rpc test");
Object params = new Object[] { request };
Object issue = client.execute("backlog.createIssue", params);

String key = ((Map<String, Object>) issue).get("key");
String url = ((Map<String, Object>) issue).get("url");
System.out.println(key + " : " + url);

ちなみにちなみに、AtlassianからもXML-RPCライブラリが出てます。ちょっと試しただけですが、Apacheのやつよりは筋がよさそうです。

その他

ちなみにちなみにちなみに、PythonPython から Backlog API を使う - hashimoto.py - fukuoka.pyのはてなグループな感じ。XML-RPC関連のライブラリは標準で含まれているので、別途ライブラリを導入する必要はありません。

他はあまり詳しく調べてないけど、ちょっとぐぐったら先人の人たちが色々試してくれているでしょう、たぶん。


単純にXML-RPCを叩くだけなら、動的型付けな言語だとどれもあまり変わらなそう。というか、むしろ標準ライブラリとして用意されている分、PythonとかRubyとかの方が手軽かも。ただ、自分の最近のテーマである「Java開発環境の補完」という点で考えると、やっぱりGroovyになるのかな。見て分かる通り、今回のサンプルはJUnit形式なのでJava開発時にそのままユニットテストに組み込みますしね。

*1:サンプルコードやこのエントリを書いてて、特に実感しました