2014-09-05 10 views
31

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

Im Grunde bin ich auf der Suche nach einer Möglichkeit, HTTP-GETs aus Groovy-Code zu tun, ohne Bibliotheken importieren zu müssen (wenn überhaupt möglich). Aber da dieses Modul nicht Teil von Core Groovy zu sein scheint, bin ich mir nicht sicher, ob ich hier die richtige Lib habe.

+0

Um die folgenden Antworten zusammenzufassen: j = new groovy.json.JsonSlurper(). ParseText (neue URL ("https://httpbin.org/get") .getText()) 'dann ' println j.headers ["User-Agent"] ' – MarkHu

+0

Sie können auch eine aktualisierte (Neu-) Version der HttpBuilder-Bibliothek auschecken - https://http-builder-ng.github.io/http-builder-ng/ – cjstehno

+0

Wenn Sie' @ verwenden Grab 'es macht http-Builder ziemlich schmerzlos zu bedienen: '@Grab (group =' org.codehouse.groovy.module.http-builder ', modul =' http-builder ', version =' 0.7 ')' –

Antwort

7

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']) 

Es ist besonders nützlich, wenn Sie Fehlerbehandlung und allgemein mehr Funktionalität als nur das Abrufen von Inhalt mit GET benötigen.

+0

Danke @ Dakota Brown - und kannst du bestätigen, dass ich nichts importieren muss? – smeeb

+0

Das ist der Nachteil, Sie brauchen das Glas: http://groovy.codehaus.org/modules/http-builder/download.html. Nichts in groovigem Kern dafür. –

+0

Danke @Dakota Brown - bitte sehen Sie meinen Kommentar unter Will P's Antwort - Ich habe die gleiche Frage für Sie – smeeb

2

Ich glaube nicht, dass http-Builder ein Groovy-Modul ist, sondern eher eine externe API auf apache http-client, also müssen Sie Klassen importieren und eine Reihe von APIs herunterladen. Sie verwenden besser Gradle oder @Grab das Glas und Abhängigkeiten zum Download:

@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-Website ging nach unten, können Sie die JAR an (https://mvnrepository.com/artifact/org.codehaus.groovy.modules.http-builder/http-builder)

+0

Danke @Will P - funktioniert das auf einer Grails GSP Seite? – smeeb

+0

Ich weiß nicht, Grails genug zu beantworten, und ich glaube nicht, dass es nicht zu der Ansicht gehört, weder. Sie würden wahrscheinlich die Abhängigkeiten besser herunterladen oder 'URL' verwenden, wie in @ans Antwort – Will

+1

@smeeb das' @ Grab' in der 'grails-app/conf/BuildConfig.groovy' hinzugefügt wird. Dann würde es innerhalb von Controllern, Diensten, ... funktionieren - aber fügen Sie bitte keinen Code zur Ansicht hinzu. – cfrick

38

finden, wenn Ihre Bedürfnisse sind einfach und Sie vermeiden wollen zusätzliche Abhängigkeiten Hinzufügen Sie die getText() Methoden in der Lage sein zu verwenden, die Groovy zur java.net.URL Klasse fügt hinzu:

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 mich wieder dort binäre Daten erwartet werden s auch ähnliche Funktionalität durch die newInputStream() Methoden zur Verfügung gestellt.

18

Die einfachste bekam zu sein:

def html = "http://google.com".toURL().text 
+0

Brilliante Idee. Was kann ich tun, wenn wir den Proxy-Server-Namen und -Port hinzufügen müssen? – Heinz

21

india 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
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 
     } 

    } 
} 
+0

Dieser Code ist für mich gearbeitet – SQA

1

Sie Vorteil von Groovy nehmen können Funktionen wie mit(), die Verbesserung der URLConnection und vereinfachte Getter/Setter:

GET:

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

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