2015-10-07 52 views
0

我已經潛入Groovy中,用於功能測試WebAPI。我發現List.execute()非常令人沮喪地在Windows和Linux上工作。我無法獲得相同的JSON字符串來同時工作。傳遞JSON在Groovy中捲曲看起來依賴於平臺

下面是我不得不求助於什麼:

private createLeaderboard(String name) { 
    def url = 'http://localhost:8888/v1/tournaments' 
    // Here's the JSON 
    def body = '{"name":"' + name + '"}' 
    if (System.properties['os.name'].toLowerCase().contains('windows')) { 
     // I have to surround with single quotes to get working on Windows 
     body = "'" + body + "'" 
    } 
    def content = "content-type:application/json" 
    def command = ['curl', '-s', '--request', 'POST', '--data', body, '--header', content, url] 
    println "command:" + command 
    def proc = command.execute() 
    proc.waitFor() 
    def jsonstr = proc.in.text 
    assertEquals(0, proc.exitValue()) 
    def obj = JSON.parseText(jsonstr) 
    return obj 
} 

如果我不環繞JSON身體與窗戶單引號,應用程序看到

name:thename 

與兩個大括號並刪除雙引號。但是如果我用單引號括起來,Linux會看到

'{"name":"thename"}' 

這也打破了應用程序中的JSON解析器。

我應該添加我使用grang與appengine插件並在appengineFunctionalTest任務中運行,如果它有任何方位。

回答

1

,而不是與殼遊戲,並試圖解決的命令行表達參數可怕的性質,你可以使用groovy-wslite library

然後你的方法就變成了:

import groovy.json.JsonBuilder 
import wslite.rest.* 

private createLeaderboard(String name) { 
    def client = new RESTClient('http://localhost:8888') 
    def response = client.post(path:'/v1/tournaments', 
           accept:'application/json', 
           headers:['Content-Type':'application/json']) { 
     text new JsonBuilder([name: name]).toString() 
    } 
    response.json 
} 
+0

非常優雅和完美的作品。謝謝。 –