Groovy eingebauter REST / HTTP-Client?

78

Ich habe gehört, dass Groovy einen eingebauten REST / HTTP-Client hat. Die einzige Bibliothek, die ich finden kann, ist HttpBuilder , oder?

Grundsätzlich suche ich nach einer Möglichkeit, HTTP-GETs aus Groovy-Code heraus auszuführen, ohne Bibliotheken importieren zu müssen (wenn überhaupt möglich). Aber da dieses Modul nicht Teil von Groovy zu sein scheint, bin ich mir nicht sicher, ob ich hier die richtige Bibliothek habe.

smeeb
quelle
1
Um die folgenden Antworten j = new groovy.json.JsonSlurper().parseText(new URL("https://httpbin.org/get").getText())dann zusammenzufassenprintln j.headers["User-Agent"]
MarkHu
1
Sie können auch eine aktualisierte (Neu-) Version der HttpBuilder-Bibliothek auschecken
http-builder-ng.github.io/http-builder-ng
Wenn Sie es verwenden @Grab, ist die Verwendung von http-builder ziemlich schmerzlos:@Grab(group='org.codehaus.groovy.modules.http-builder', module='http-builder', version='0.7')
thom_nic

Antworten:

116

Native Groovy GET und POST

// GET
def get = new URL("https://httpbin.org/get").openConnection();
def getRC = get.getResponseCode();
println(getRC);
if(getRC.equals(200)) {
    println(get.getInputStream().getText());
}

// POST
def post = new URL("https://httpbin.org/post").openConnection();
def message = '{"message":"this is a message"}'
post.setRequestMethod("POST")
post.setDoOutput(true)
post.setRequestProperty("Content-Type", "application/json")
post.getOutputStream().write(message.getBytes("UTF-8"));
def postRC = post.getResponseCode();
println(postRC);
if(postRC.equals(200)) {
    println(post.getInputStream().getText());
}
Jim Perris
quelle
1
Tolle Antwort. Arbeitete wie Charme.
Mahendra Prabhu
2
Wie setzen Sie damit Header für GET- oder POST-Aufrufe?
DLeh
2
@DLeh Die setRequestProperty-Methode macht das. Ich habe es im Beispiel verwendet, um den Content-Type-Header festzulegen. Siehe docs.oracle.com/javase/8/docs/api/java/net/…
Jim Perris
In der Pipeline als Code müssen Sie dies in einer gemeinsam genutzten Bibliothek tun, andernfalls verbietet Jenkins dies aus Sicherheitsgründen. Das Überschreiben ist möglich, aber dann können Sie wirklich Schwachstellen hinzufügen.
alter Mönch
Wie bekomme ich die Antwortheader? Ich kann es nicht herausfinden.
luxin.chen
62

Wenn Ihre Anforderungen einfach sind und Sie das Hinzufügen zusätzlicher Abhängigkeiten vermeiden möchten, können Sie möglicherweise die getText()Methoden verwenden, die Groovy der java.net.URLKlasse hinzufügt :

new URL("http://stackoverflow.com").getText()

// or

new URL("http://stackoverflow.com")
        .getText(connectTimeout: 5000, 
                readTimeout: 10000, 
                useCaches: true, 
                allowUserInteraction: false, 
                requestProperties: ['Connection': 'close'])

Wenn Sie wieder Binärdaten erwarten, bieten die newInputStream()Methoden ähnliche Funktionen .

John Wagenleitner
quelle
2
Wie wäre es mit einer Post-Anfrage?
Dnafication
30

Das einfachste muss sein:

def html = "http://google.com".toURL().text
John
quelle
Geniale Idee. Was kann ich tun, wenn wir den Namen und den Port des Proxyservers hinzufügen müssen?
Heinz
Die Proxy-Einstellungen werden von der enthaltenen JVM gesteuert, wie in der Oracle-Dokumentation beschrieben .
Matias Bjarland
22

Sie können Groovy-Funktionen wie with (), Verbesserungen an URLConnection und vereinfachte Getter / Setter nutzen:

ERHALTEN:

String getResult = new URL('http://mytestsite/bloop').text

POST:

String postResult
((HttpURLConnection)new URL('http://mytestsite/bloop').openConnection()).with({
    requestMethod = 'POST'
    doOutput = true
    setRequestProperty('Content-Type', '...') // Set your content type.
    outputStream.withPrintWriter({printWriter ->
        printWriter.write('...') // Your post data. Could also use withWriter() if you don't want to write a String.
    })
    // Can check 'responseCode' here if you like.
    postResult = inputStream.text // Using 'inputStream.text' because 'content' will throw an exception when empty.
})

Beachten Sie , wird der POST starten , wenn Sie versuchen , einen Wert aus dem HttpURLConnection zu lesen, wie responseCode, inputStream.textoder getHeaderField('...').

Daniel
quelle
3
Für die 'Notiz' gestimmt, die der Schlüssel war. Danke
xbmono
1
Das sieht sehr einfach aus. Was ist mit Ausnahmebehandlung und Ressourcenbehandlung? Gibt es keine close()und disconnect()notwendig für die offene Verbindung? Gibt es eine einfache Möglichkeit, den Inhalt einer Datei über den http post outputstream zu übertragen?
CodingSamples
14

HTTPBuilder ist es. Sehr einfach zu bedienen.

import groovyx.net.http.HTTPBuilder

def http = new HTTPBuilder('https://google.com')
def html = http.get(path : '/search', query : [q:'waffles'])

Dies ist besonders nützlich, wenn Sie eine Fehlerbehandlung und im Allgemeinen mehr Funktionen benötigen, als nur Inhalte mit GET abzurufen.

Dakota Brown
quelle
Danke @Dakota Brown - und können Sie bestätigen, dass ich nichts importieren muss?
Smeeb
Das ist der Nachteil, Sie benötigen das Glas: groovy.codehaus.org/modules/http-builder/download.html . Nichts im groovigen Kern dafür.
Dakota Brown
Danke @Dakota Brown - bitte sehen Sie meinen Kommentar unter Will Ps Antwort - Ich habe die gleiche Frage für Sie
smeeb
Mit grails.org/plugin/rest können Sie HTTP Builder im GRAILS-Projekt verwenden
Dakota Brown
2
Keine Ahnung, warum dies abgelehnt wird. Gute Lösung, Upvoting.
Audrius Meskauskas
1

Ich denke nicht, dass http-builder ein Groovy-Modul ist, sondern eine externe API über dem Apache-http-Client, sodass Sie Klassen importieren und eine Reihe von APIs herunterladen müssen. Verwenden Sie Gradle besser oder @Grabladen Sie das JAR und die Abhängigkeiten herunter:

@Grab(group='org.codehaus.groovy.modules.http-builder', module='http-builder', version='0.7.1' )
import groovyx.net.http.*
import static groovyx.net.http.ContentType.*
import static groovyx.net.http.Method.*

Hinweis: Da die CodeHaus-Site nicht mehr verfügbar ist, finden Sie die JAR unter ( https://mvnrepository.com/artifact/org.codehaus.groovy.modules.http-builder/http-builder ).

Wille
quelle
Ich kenne Grails nicht genug, um zu antworten, und ich glaube auch nicht, dass es zur Ansicht gehört. Sie sollten die Abhängigkeiten wahrscheinlich besser herunterladen oder URLgemäß @ Johns Antwort verwenden
Will
1
@smeeb das @Grabwürde in der hinzugefügt werden grails-app/conf/BuildConfig.groovy. Dann würde es in Controllern, Diensten usw. funktionieren - aber bitte fügen Sie der Ansicht keinen solchen Code hinzu.
cfrick
-1
import groovyx.net.http.HTTPBuilder;

public class HttpclassgetrRoles {
     static void main(String[] args){
         def baseUrl = new URL('http://test.city.com/api/Cirtxyz/GetUser')

         HttpURLConnection connection = (HttpURLConnection) baseUrl.openConnection();
         connection.addRequestProperty("Accept", "application/json")
         connection.with {
           doOutput = true
           requestMethod = 'GET'
           println content.text
         }

     }
}
SQA
quelle