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.


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());
}

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 .


2
Wie wäre es mit einer Post-Anfrage?
Dnafication


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('...').


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.


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 ).


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
         }

     }
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.