2013-08-28 35 views
1

那麼我是Groovy/Grails的新手。我編寫了一個使用RESTClient向JIRA服務器發送HTTP POST請求的Groovy腳本。 POST請求發送JQL查詢並以JSON格式接收結果。以下是完整的代碼:Groovy腳本到Grails應用程序

import groovyx.net.http.RESTClient; 
import groovyx.net.http.HttpResponseDecorator; 
import org.apache.http.HttpRequest; 
import org.apache.http.protocol.HttpContext; 
import org.apache.http.HttpRequestInterceptor; 
import groovy.json.JsonSlurper; 
import static groovyx.net.http.Method.* 
import static groovyx.net.http.ContentType.* 

@Grab(value = 'org.codehaus.groovy:groovy-all:2.1.6', 
     initClass = false) 
@Grapes([ 
@Grab(group = 'org.codehaus.groovy.modules.http-builder', 
     module = 'http-builder', version = '0.5.2'), 
@GrabExclude('org.codehaus.groovy:groovy') 
]) 

// connect to JIRA 
def jiraApiUrl = 'http://my-jira.com/rest/api/2/' 
def jiraClient = new RESTClient(jiraApiUrl); 

// authentication 
def basic = 'Basic ' + 'username:password'.bytes.encodeBase64().toString() 
jiraClient.client.addRequestInterceptor (
new HttpRequestInterceptor() { 
    void process(HttpRequest httpRequest, 
       HttpContext httpContext) { 
         httpRequest.addHeader('Authorization', basic) 
     } 
    }) 

// http post method 
def uriPath = 'search' 
def param = [maxResults : 1, jql : '<jql-query>'] 

def Issues = jiraClient.post(requestContentType : JSON, path : uriPath, body : param) 

def slurpedIssues = new JsonSlurper().parseText(Issues.data.toString()) 

println Issues.data.total 

我需要將此腳本遷移到Grails應用程序。有關如何做同樣的建議?

回答

1
  1. 定義在BuildConfig依賴關係(除了常規的依賴性)
  2. 腳本複製內容到服務

可能延長:

  1. 使用grails rest plugingrails rest-client-builder plugin而不是http建設者
+0

感謝您的答覆!非常感激。 我添加了依賴關係並將腳本複製到** Controller **。當我從Web瀏覽器訪問控制器時,它給了我一個NullPointerException。 「消息:無法調用空對象上的方法post() 服務中發生的情況也是如此。有什麼建議麼? –

+0

聽起來像'jiraClient'爲空。值得檢查,如果你正確地初始化它。 – Armand

+0

感謝您的提示!初始化時出現問題。但現在得到一個新的NullPointerException。嘆!同一行,'def Issues = jiraClient.post(requestContentType:JSON,路徑:uriPath,body:param)'。 「消息:null」。 –

0

將邏輯放入服務對象將使您能夠執行依賴注入,這是本機的grails服務。

此外,如果您的應用有許多用戶試圖發出請求,則應考慮使用AsyncHTTPBuilder

0

我堅信,服務響應將直接渲染到JSON

//your controller 
    class AbcController{ 

    //your action 
    def save() { 
    render(abcService.save(params) as JSON)//your service response now been rendered to JSON 
     } 

    } 

//your service class class AbcService { 
    def save(params){ 
    .... 
    return something 
    } 
}