web-dev-qa-db-fra.com

Client REST/HTTP intégré Groovy?

J'ai entendu dire que Groovy a un client REST/HTTP intégré. La seule bibliothèque que je puisse trouver est HttpBuilder , est-ce cela?

En gros, je cherche un moyen de créer des HTTP GET à partir du code Groovy sans importer aucune bibliothèque (si possible). Mais comme ce module ne semble pas faire partie du coeur de Groovy, je ne suis pas sûr d'avoir la bonne bibliothèque ici.

50
smeeb

Native Groovy GET et 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());
}
53
Jim Perris

Si vos besoins sont simples et que vous souhaitez éviter d'ajouter des dépendances supplémentaires, vous pourrez peut-être utiliser les méthodes getText() que Groovy ajoute à la classe Java.net.URL:

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

// or

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

Si vous attendez des données binaires, il existe également des fonctionnalités similaires fournies par les méthodes newInputStream().

51
John Wagenleitner

Le plus simple devait être:

def html = "http://google.com".toURL().text
22
John

HTTPBuilder est-ce. Très facile à utiliser.

import groovyx.net.http.HTTPBuilder

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

C'est particulièrement utile si vous avez besoin d'une gestion des erreurs et généralement de plus de fonctionnalités que la simple extraction de contenu avec GET.

10
Dakota Brown

Vous pouvez tirer parti des fonctionnalités de Groovy comme avec (), des améliorations d'URLConnection et des getters/setters simplifiés:

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

Remarque: le POST démarre lorsque vous essayez de lire une valeur à partir de HttpURLConnection, telle que responseCode, inputStream.text ou getHeaderField('...').

9
Daniel

Je ne pense pas que http-builder soit un module Groovy, mais plutôt une API externe au-dessus de Apache http-client . Vous devez donc importer des classes et télécharger plusieurs API. Il vaut mieux utiliser Gradle ou @Grab pour télécharger le fichier jar et ses dépendances:

@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.*

Remarque: depuis la fermeture du site CodeHaus, vous pouvez trouver le fichier JAR à l'adresse ( https://mvnrepository.com/artifact/org.codehaus.groovy.modules.http-builder/http-builder ).

2
Will
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
SQA