SharePointのREST APIを使ってリストに項目を追加する
開発チームの情報共有にSharePointを使っているケースでは、何かのバッチで項目を追加したいことがあります。例えば、自動テストの結果を記録したり、インスペクションに引っかかったモジュールを記録したりといった使い道が考えられます。SharePointのリストはカスタマイズ性が高く、Excel連携も簡単なので現場で重宝します*1。
本稿では、JenkinsのジョブからGroovyスクリプトを実行し、SharePointのリストに項目を追加する方法を説明します。
準備
SharePointが載っているWindowsサーバにローカルユーザ(例えば jenkins ユーザ)を作成します。また、当該ユーザがSharePointに書き込めるよう権限を設定します。
私が試した限りでは、以下の設定が必要でした。
- サイトコレクションの権限を付与する。
- Webアプリケーションの権限を付与する。
- SharePointサーバの全体管理→セキュリティ→Webアプリケーションのポリシーから設定
ここで作成したユーザのIDとパスワードは、後述のNTLM認証で使います。
項目追加の方法
以下のURLにJSONをPOSTします。
http://[FQDN]/[サイトのURI]/_vti_bin/listdata.svc/[リスト名]
例えば「devサイト」の「うんコードリスト」に項目を追加したい場合は以下のURLになります。
http://sharepoint.example.com/dev/_vti_bin/listdata.svc/うんコードリスト
JSONはリストの項目名と値のハッシュでOKです。こんな感じでOKなはず:
{"FQCN": "com.example.app.controller.Hoge", "LOC": 5000, "サイクロマティック数": 100}
リストが見つからない場合はHTTP 400、JSONがおかしい場合はHTTP 500が返ってきます。それ以前の問題として、NTLM認証や認可が通らない場合はHTTP 401が返ってきます。
実装例
JsonBuilderで生成したJSONを、HTTPBuilderでPOSTします。こんな感じ:
import groovy.json.JsonBuilder import groovyx.net.http.ContentType import groovyx.net.http.HTTPBuilder import groovyx.net.http.HttpResponseException import org.apache.http.auth.AuthScope import org.apache.http.auth.NTCredentials class Main { static void main(String[] args) { def item = [ '列A': '値1', '列B': '値2', '列C': '値3', ] def builder = new JsonBuilder(item) def http = new HTTPBuilder(System.properties.listUri) // NTLM認証を有効にする http.client.authSchemes.register('ntlm', new NTLMSchemeFactory()) http.client.credentialsProvider.setCredentials(AuthScope.ANY, new NTCredentials( System.properties.ntlmUser, System.properties.ntlmPassword, System.properties.ntlmWorkstation, System.properties.ntlmDomain)) http.post( contentType: ContentType.JSON, requestContentType: ContentType.JSON, body: builder.toString()) } }
NTLMSchemeFactoryクラスは以下を参照してください。
http://hc.apache.org/httpcomponents-client-ga/ntlm.html
build.gradle を書いてビルドします。
apply plugin: 'groovy' apply plugin: 'application' repositories { mavenCentral() } dependencies { groovy 'org.codehaus.groovy:groovy-all:2.0.4' compile 'org.codehaus.groovy.modules.http-builder:http-builder:0.6' compile 'jcifs:jcifs:1.3.17' } mainClassName = 'Main'
gradle run で実行できます。