GeekFactory

int128.hatenablog.com

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 で実行できます。

*1:当方、どちらかというとExcelアレルギーだったり