ice rabbit programming

[Groovy] Groovy(build.gradle)에서 HTTP 통신하기 본문

Development/CI & CD

[Groovy] Groovy(build.gradle)에서 HTTP 통신하기

판교토끼 2020. 10. 10. 23:54

아마 build.gradle 파일은 안드로이드 쪽에서 많이 봤을 것이다. 본인이 안드로이드를 했던 시점은 2017~2018년 쯤이라 지금은 달라졌을 수도 있지만, 자바 관련된 빌드를 할 때 build.gradle을 이용한다. 이 파일은 Groovy라는 언어로 작성되는데, Groovy는 자바를 베이스로 파이썬, 루비 등의 특징을 더한 동적 OOP 언어이다. 자바를 베이스로 만들었기 때문에 자바의 라이브러리 등을 가져다 쓸 수 있으며, 자바 개발자들은 시간을 많이 들이지 않고 사용할 정도로 익힐 수 있다. 다만 본인은 자바를 학부 수업 한 개와 안드로이드 조금 외에는 다루어본 적이 없기에...

좌우간 빌드를 할 때 이걸 사용하는데, 자바가 아닌 C# 클라이언트 프로그램임에도 bat 파일들과의 조화를 통해 build.gradle로 빌드가 가능함을 알게 되었다.

오늘 중점적으로 볼 부분은 빌드 자체는 아니고, build.gradle 즉 Groovy에서 HTTP 통신을 하는 방법에 대해서 포스팅하고자 한다.

내장함수 사용하기

def result = new URL("www.mydomain.com").json()

가장 간단하게는 인증이나 헤더 설정 등이 필요 없고, GET으로만 접근해서 받아올 수 있다면 위와 같이 사용할 수 있다. 결과값이 JSON 형태로 result에 담기게 된다.

HTTPBuilder 패키지 사용하기

사실 위처럼 부를 수 있는 경우가 많지는 않고 또 저렇게 부른다 해도 다른 method 등으로 불러야하는 경우가 많을 것이다. 그 때 주로 사용하는 패키지가 HTTPBuilder이다.

import groovyx.net.http.HTTPBuilder
import static groovyx.net.http.ContentType.JSON
import static groovyx.net.http.Method.GET
import static groovyx.net.Method.POST

def getHttp() {
    // HTTPBuilder 객체 생성
    def httpBuilder = new HTTPBuilder("www.mydomain.com")

    // 실제 request 호출
    httpBuilder.request(GET) {
        // request config 설정
        uri.path = '/my/path'
        headers.'myOption' = 'option'
        uri.query = ['param': 'hi']

        // 실패했을 경우(2xx 이외)
        response.failure = { resp, json ->
            println("API error respone (${resp.statusLine.statusCode}): ${json}")
            System.exit(1)
        }

        // 성공했을 경우(2xx)
        response.success = { resp, json ->
            println("API Response : ${json}")
            result = json
        }
    }

    return result
}

위와 같이 import를 하고, 호출 함수 내부에서 request/response 설정을 하면 된다.

가끔 import 할 수 없다는 에러가 발생하는데, 버전에 따라서 둘 중 하나를 써주면 되겠다.

dependencies {
    classpath "org.codehaus.groovy.modules.http-builder:http-builder:0.7.1"
}
compile "org.codehaus.groovy.modules.http-builder:http-builder:0.7.1"

본인은 위의 버전이었는데, 실제로 사용자들은 아래가 많은 것 같다. stackoverflow 등에서 아래 방법이 많이 나와서 import하는 데에 꽤나 헤맸었다. 본인 코드에서 dependencies를 어떻게 걸고있는지에 따라서 유동적으로 해주면 되겠다.

 

* 추가 : 마크다운에서 코드 블럭에 Groovy 하이라이트를 적용했는데, 티스토리에서 지원하지 않는 것 같다. plain text로 나오고 있다...