記事一覧

C#でTestLinkのAPIを叩く

2012.02.15

最近オープンソースのプロジェクト管理を色々試していて、ブラウザからだけではなく、API経由で色々操作を行いたいと思うようになりました。
TestLinkの場合、\lib\api\sample_clients以下にJavaやRubyのサンプルがあるのですが、自分の環境には合わないのでC#で自作することにしました。
C#は初めてだったのですが、始めてみると意外と簡単にプログラミングすることができました。
TestLinkAPIはXML-RPCという仕様らしいのですが、基本的にはXMLのメッセージをPOSTして、結果がXMLで返ってきます。
C#ではWeb系のライブラリを利用することで、この動きを簡単に実装することができます。


// リクエストの作成
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
req.Method = "POST";
req.ContentType = "text/xml";
req.ContentLength = data.Length;
req.UserAgent = "tlclient";

// ポスト・データの書き込み
Stream reqStream = req.GetRequestStream();
reqStream.Write(data, 0, data.Length);
reqStream.Close();

// レスポンスの取得と読み込み
WebResponse res = req.GetResponse();
Stream resStream = res.GetResponseStream();
StreamReader sr = new StreamReader(resStream, Encoding.UTF8);

sr.Close();
resStream.Close();

・WebRequest.Createでリクエストを作り
 ↓
・GetRequestStreamで取得したストリームにデータを書き込み
 ↓
・GetResponseでレスポンスが返ってくるのでStreamReader経由で結果を読み込む
という流れになります
APIに渡すXMLは構造が決まっているので、定型化したプログラムになります


XmlDocument xInp = new XmlDocument();
System.Xml.XmlDeclaration decl = xInp.CreateXmlDeclaration("1.0", "UTF-8", null);
xInp.AppendChild(decl);
XmlNode root = xInp.CreateElement("methodCall");
XmlNode meth = xInp.CreateElement("methodName"); meth.InnerText = cmd;
XmlNode pams = xInp.CreateElement("parms");
XmlNode parm = xInp.CreateElement("parm");
XmlNode strc = xInp.CreateElement("struct");
foreach (DictionaryEntry col in ht)
{
XmlNode memb = xInp.CreateElement("member");
XmlNode mnam = xInp.CreateElement("name");
mnam.InnerText = col.Key.ToString();
XmlNode mval = xInp.CreateElement("string");
mval.InnerText = col.Value.ToString();
memb.AppendChild(mnam);
memb.AppendChild(mval);
strc.AppendChild(memb);
}
parm.AppendChild(strc);
pams.AppendChild(parm);
root.AppendChild(meth);
root.AppendChild(pams);
xInp.AppendChild(root);
return xInp;

タグは、"methodCall"から順にぶら下がっていき、"struct"以下に渡したいパラメータを作ります。
この時の注意は、"member"の下にパラメータを"name"と"string"のセットで渡すことです。
パラメータが複数ある場合は、"struct"に"member"のツリーを複数追加していくことになります。
私のプログラムではパラメータの取り回しをしやすいように、各パラメータをHasTableの(パラメータ名:値)の組として、ArrayListの配列で扱うようにしてみました。
(テスト計画一覧の取得関数の例)

public ArrayList getPlans(int pid)
{
Hashtable ht = new Hashtable();
ht.Add("devKey", TLClient.key);
ht.Add("testprojectid", pid);
ArrayList list = postCmd("tl.getProjectTestPlans", ht);
return list;
}

HashTableに
 devkey:TestLinkのAPIキー
 testprojectid:テストプロジェクトのID値
という組で渡し、XMLツリーに展開します。

タグ:C# TestLink