1. 概要

今日では、Webを介してアプリケーションによってデータを公開するさまざまな方法が見られます。

多くの場合、アプリケーションはSOAPまたはRESTWebサービスを使用してAPIを公開します。 ただし、RSSやAtomなどのストリーミングプロトコルも検討する必要があります。

このクイックチュートリアルでは、これらのプロトコルごとにGroovyでWebサービスを操作するためのいくつかの便利な方法について説明します。

2. HTTPリクエストを実行する

まず、URLクラスを使用して簡単なHTTPGETリクエストを実行しましょう。 探索中にPostmanEchoAPIを使用します。

まず、URLクラスのopenConnectionメソッドを呼び出してから、requestMethodをGETに設定します。

def postmanGet = new URL('https://postman-echo.com/get')
def getConnection = postmanGet.openConnection()
getConnection.requestMethod = 'GET'
assert getConnection.responseCode == 200

同様に、 requestMethod をPOSTに設定することで、POSTリクエストを作成できます。

def postmanPost = new URL('https://postman-echo.com/post')
def postConnection = postmanPost.openConnection()
postConnection.requestMethod = 'POST'
assert postConnection.responseCode == 200

また、 outputStream.withWriter を使用して、パラメーターをPOST要求に渡すことができます。

def form = "param1=This is request parameter."
postConnection.doOutput = true
def text
postConnection.with {
    outputStream.withWriter { outputStreamWriter ->
        outputStreamWriter << form
    }
    text = content.text
}
assert postConnection.responseCode == 200

ここで、Groovyの with クロージャーは非常に便利に見え、コードをよりクリーンにします。

JsonSlurper を使用して、String応答をJSONに解析してみましょう。

JsonSlurper jsonSlurper = new JsonSlurper()
assert jsonSlurper.parseText(text)?.json.param1 == "This is request parameter."

3. RSSとAtomフィード

RSSおよびAtomフィードは、ニュース、ブログ、技術フォーラムなどのコンテンツをWeb上で公開するための一般的な方法です。

また、両方のフィードはXML形式です。 したがって、GroovyのXMLParserクラスを使用してコンテンツを解析できます。

RSSフィードを利用してGoogleニュースのトップストーリーをいくつか読んでみましょう。

def rssFeed = new XmlParser()
    .parse("https://news.google.com/rss?hl=en-US&gl=US&ceid=US:en")
def stories = []
(0..4).each {
    def item = rssFeed.channel.item.get(it)
    stories << item.title.text()
}
assert stories.size() == 5

同様に、Atomフィードを読み取ることができます。 ただし、両方のプロトコルの仕様が異なるため、Atomフィードではコンテンツへのアクセス方法が異なります。

def atomFeed = new XmlParser()
    .parse("https://news.google.com/atom?hl=en-US&gl=US&ceid=US:en")
def stories = []
(0..4).each {
    def entry = atomFeed.entry.get(it)
    stories << entry.title.text()
}
assert stories.size() == 5

また、GroovyはすべてのJavaライブラリをサポートしていることを理解しています。Groovyでは推奨されています。 したがって、RSSフィードを読み取るために RomeAPIを確実に使用できます。

4. SOAPの要求と応答

SOAPは、アプリケーションがWeb上でサービスを公開するために使用する最も一般的なWebサービスプロトコルの1つです。

groovy-wsliteライブラリを使用してSOAPAPIを使用します。 最新の依存関係pom.xmlに追加しましょう。

<dependency>
    <groupId>com.github.groovy-wslite</groupId>
    <artifactId>groovy-wslite</artifactId>
    <version>1.1.3</version>
</dependency>

または、Gradleを使用して最新の依存関係を追加することもできます。

compile group: 'com.github.groovy-wslite', name: 'groovy-wslite', version: '1.1.3'

または、Groovyスクリプトを作成する場合。 @Grabを使用して直接追加できます。

@Grab(group='com.github.groovy-wslite', module='groovy-wslite', version='1.1.3')

groovy-wsliteライブラリは、SOAPAPIと通信するためのSOAPClientクラスを提供します。 同時に、リクエストメッセージを作成するためのSOAPMessageBuilderクラスがあります。

SOAPClient を使用して、数値変換SOAPサービスを使用してみましょう。

def url = "http://www.dataaccess.com/webservicesserver/numberconversion.wso"
def soapClient = new SOAPClient(url)
def message = new SOAPMessageBuilder().build({
    body {
        NumberToWords(xmlns: "http://www.dataaccess.com/webservicesserver/") {
            ubiNum(123)
        }
    }
})
def response = soapClient.send(message.toString());
def words = response.NumberToWordsResponse
assert words == "one hundred and twenty three "

5. RESTリクエストとレスポンス

RESTは、Webサービスの作成に使用されるもう1つの一般的なアーキテクチャスタイルです。 また、APIは、GET、POST、PUT、DELETEなどのHTTPメソッドに基づいて公開されます。

5.1. 得る

すでに説明したgroovy-wsliteライブラリを使用して、RESTAPIを使用します。 手間のかからない通信のためのRESTClientクラスを提供します

すでに説明したPostmanAPIに対してGETリクエストを作成しましょう。

RESTClient client = new RESTClient("https://postman-echo.com")
def path = "/get"
def response
try {
    response = client.get(path: path)
    assert response.statusCode = 200
    assert response.json?.headers?.host == "postman-echo.com"
} catch (RESTClientException e) {
    assert e?.response?.statusCode != 200
}

5.2. 役職

それでは、PostmanAPIにPOSTリクエストを作成しましょう。 同時に、フォームパラメータをJSONとして渡します。

client.defaultAcceptHeader = ContentType.JSON
def path = "/post"
def params = ["foo":1,"bar":2]
def response = client.post(path: path) {
    type ContentType.JSON
    json params
}
assert response.json?.data == params

ここでは、JSONをデフォルトのacceptヘッダーとして設定しました。

6. Webサービスの認証

Webサービスとアプリケーションが相互に通信する量が増えるにつれ、安全なWebサービスを利用することをお勧めします。

その結果、 HTTPSと、基本認証やOAuthなどの認証メカニズムの組み合わせが重要になります

したがって、アプリケーションはWebサービスAPIを使用しながら自身を認証する必要があります。

6.1. 基本認証

すでに説明したRESTClientクラスを使用できます。 HTTPBasicAuthorization クラスを資格情報とともに使用して、基本認証を実行してみましょう。

def path = "/basic-auth"
client.authorization = new HTTPBasicAuthorization("postman", "password")
response = client.get(path: path)
assert response.statusCode == 200
assert response.json?.authenticated == true

または、 headers パラメーターで資格情報(Base64エンコード)を直接渡すこともできます。

def response = client
.get(path: path, headers: ["Authorization": "Basic cG9zdG1hbjpwYXNzd29yZA=="])

6.2. OAuth 1.0

同様に、コンシューマーキーやコンシューマーシークレットなどの認証パラメーターを渡してOAuth1.0リクエストを作成できます。

ただし、他のメカニズムのようにOAuth 1.0のサポートが組み込まれていないため、自分で作業を行う必要があります。

def path = "/oauth1"
def params = [oauth_consumer_key: "RKCGzna7bv9YD57c", 
    oauth_signature_method: "HMAC-SHA1", 
    oauth_timestamp:1567089944, oauth_nonce: "URT7v4", oauth_version: 1.0, 
    oauth_signature: 'RGgR/ktDmclkM0ISWaFzebtlO0A=']
def response = new RESTClient("https://postman-echo.com")
    .get(path: path, query: params)
assert response.statusCode == 200
assert response.statusMessage == "OK"
assert response.json.status == "pass"

7. 結論

このチュートリアルでは、GroovyWebサービスを操作するためのいくつかの便利な方法について説明しました。

同時に、RSSまたはAtomフィードを読む簡単な方法を見てきました。

いつものように、コードの実装はGitHub利用できます。