Gradle脚本要在没有任何第三方插件的情况下调用REST Web服务,任何指针?

use*_*381 26 rest groovy gradle

嗨,我需要调用REST服务作为buildscript(Gradle)的一部分,没有任何第三方插件,我怎么能使用Groovy来做到这一点?

(我的第一次尝试)

repositories {
    mavenCentral()
}
      dependencies {  
            complie "org.codehaus.groovy.modules.http-builder:http-builder:0.5.2"  
    }  

task hello {
    def http = new HTTPBuilder("http://myserver.com:8983/solr/select?q=*&wt=json")
    http.auth.basic 'username', 'password'
    http.request(GET, JSON ) { req ->
    }
}
Run Code Online (Sandbox Code Playgroud)

tim*_*tes 19

你不能这样做吗?

new URL( 'http://username:password@myserver.com:8983/solr/select?q=*&wt=json' ).text
Run Code Online (Sandbox Code Playgroud)

  • 问题是关于一般REST,而不是特别GET,所以我想curl更适合那个. (2认同)

JBa*_*uch 14

在没有外部库的情况下从groovy调用REST的最简单方法是执行CURL.这是一个调用Artifactory,获取JSON并解析它的示例:

import groovy.json.JsonSlurper

task hello {
    def p = ['curl', '-u', '"admin:password"', "\"http://localhost:8081/api/storage/libs-release-local?list&deep=1\""].execute()
    def json = new JsonSlurper().parseText(p.text)
}
Run Code Online (Sandbox Code Playgroud)

  • 该解决方案取决于系统. (38认同)
  • -1,您通过使用外部工具(CURL)避免使用外部库.Gradle全部设置为自动下载和安装库,但它不会对CURL执行相同的操作. (12认同)
  • @JBaruch没有特别的意义,也没有个人进攻.但我注意到1)你给出了一个不符合要求的草率答案; 2)然后你花时间亲自批评其他答案并且幸灾乐祸地认为你的答案更好; 3)你没有看到明显的缺陷,这是重新引入gradle旨在解决的问题4)当Iain提到它时,你通过使用reductio ad荒谬来嘲笑他/她.所以我给了一个-1作为警告,任何跟随路线的人(你现在知道无处可去)和一个简短的评论 - 因为我不喜欢在不给出理由的情况下进行投票. (7认同)
  • 那不是[Code Golf](http://codegolf.stackexchange.com/),而不是编程奥运会.我的解决方案以最简单的方式完成工作,特别是考虑到REST API缺少良好的Groovy库(HttpBuilder不是那么好). (6认同)
  • @Opal只要它涵盖Linux,MacOs和Windows,我就可以了. (4认同)
  • 不知道.谢谢! (2认同)
  • @JBaruch这不是奥运会,但仍然没有这个解决方案.它不适用于Windows,不适用于许多Linux发行版(包括常用于docker容器的发行版).它只是将设置问题从Gradle推送到操作系统. (2认同)
  • @JBaruch是的,就像我说的那样:你的解决方案已经差不多三年了,而且已经很糟糕了,甚至你,它的作者今天也不会使用它.其他一些答案(包括您评论并描述为劣等的答案)仍然很有意义(并且根据今天使用HTTP Builder NG再次阅读您自己的评论). (2认同)

use*_*381 12

这是工作的人

import java.io.*
import groovyx.net.http.HTTPBuilder
import groovyx.net.http.EncoderRegistry
import static groovyx.net.http.Method.*
import static groovyx.net.http.ContentType.*

buildscript {
    repositories {
        mavenCentral()
    }   
    dependencies {
        classpath 'org.codehaus.groovy.modules.http-builder:http-builder:0.5.2'
    }   
}

task hello {
    def http = new groovyx.net.http.HTTPBuilder("http://local.com:8983/solr/update/json")

    http.request(POST, JSON ) { req ->
        req.body{

        }
        response.success = { resp, reader ->
            println "$resp.statusLine   Respond rec"

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我添加了一个加号,不需要卷曲 (4认同)
  • 您不想在没有第三方工具的情况下简单地完成它吗?比较你的答案和我的答案中的代码量。 (3认同)

Yan*_* Vo 12

这个问题在搜索引擎上的排名非常好,我一直在绊倒它。

但是,正如其他人评论的那样,我真的不喜欢接受的答案,因为它依赖于 curl。

所以这是一个完整的例子,没有任何先决条件(没有插件,没有 curl,...):

import groovy.json.JsonSlurper
import groovy.json.JsonOutput
task getExample {
    doLast {
        def req = new URL('https://jsonplaceholder.typicode.com/posts/1').openConnection()
        logger.quiet "Status code: ${req.getResponseCode()}"
        def resp = new JsonSlurper().parseText(req.getInputStream().getText())
        logger.quiet "Response: ${resp}"
    }
}
task postExample {
    doLast {
        def body = [title: "foo", body: "bar", userId: 1]
        def req = new URL('https://jsonplaceholder.typicode.com/posts').openConnection()
        req.setRequestMethod("POST")
        req.setRequestProperty("Content-Type", "application/json; charset=UTF-8")
        req.setDoOutput(true)
        req.getOutputStream().write(JsonOutput.toJson(body).getBytes("UTF-8"))
        logger.quiet "Status code: ${req.getResponseCode()}" // HTTP request done on first read
        def resp = new JsonSlurper().parseText(req.getInputStream().getText())
        logger.quiet "Response: ${resp}"
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以在您的机器上运行它,因为它们使用公共开发 API。


Zso*_*olt 7

我正在使用JsonSlurper它看起来非常简单并且与操作系统无关:

import groovy.json.JsonSlurper

String url = "http://<SONAR_URL>/api/qualitygates/project_status?projectKey=first"
def json = new JsonSlurper().parseText(url.toURL().text)
print json['projectStatus']['status']
Run Code Online (Sandbox Code Playgroud)

  • 由于与上述相同的原因,此答案遗漏了该问题。此外, JsonSlurper 与该问题几乎无关。 (2认同)