Groovy вбудований REST / HTTP-клієнт?


78

Я чув, що Groovy має вбудований REST / HTTP-клієнт. Єдина бібліотека, яку я можу знайти - HttpBuilder , це це?

В основному я шукаю спосіб зробити HTTP GET з внутрішнього коду Groovy без необхідності імпортувати будь-які бібліотеки (якщо це можливо). Але оскільки цей модуль, здається, не є частиною ядра Groovy, я не впевнений, чи маю тут правильну бібліотеку.


1
Узагальнюючи наведені нижче відповіді, j = new groovy.json.JsonSlurper().parseText(new URL("https://httpbin.org/get").getText())тодіprintln j.headers["User-Agent"]
MarkHu

1
Ви також можете перевірити оновлену (пере) версію бібліотеки HttpBuilder
http-builder-ng.github.io/http-builder-ng

Якщо ви використовуєте, @Grabце робить http-builder досить безболісним у використанні:@Grab(group='org.codehaus.groovy.modules.http-builder', module='http-builder', version='0.7')
thom_nic

Відповіді:


118

Рідний Groovy GET і 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
Чудова відповідь. Працював як шарм.
Mister X

2
Як за допомогою цього встановити заголовки на виклики GET або POST?
DLeh

2
@DLeh Метод setRequestProperty це робить. Я використав його у прикладі для встановлення заголовка Content-Type. Див. Docs.oracle.com/javase/8/docs/api/java/net/…
Джим Перріс

У конвеєрі як код, ви повинні робити це у спільній бібліотеці, інакше jenkins заборонять це з міркувань безпеки. Замінити їх можливо, але тоді ви дійсно можете додати вразливості.
старий чернець

Як отримати заголовки відповідей? Я не можу це дізнатись.
luxin.chen

63

Якщо ваші потреби прості, і ви хочете уникати додавання додаткових залежностей, ви можете використовувати getText()методи, які Groovy додає до 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'])

Якщо ви очікуєте двійкові дані назад, існує також подібна функціональність, передбачена newInputStream()методами.


2
Як щодо запиту на публікацію?
ДНК

30

Найпростішим повинен бути:

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

Блискуча ідея. що я можу зробити, якщо нам потрібно додати ім'я та порт проксі-сервера?
Хайнц,

налаштування проксі контролюються вміщуваною JVM, як описано в документації до oracle .
Matias Bjarland,

22

Ви можете скористатися перевагами функцій Groovy, таких як with (), вдосконалення URLConnection та спрощених методів отримання / налаштування:

ОТРИМАТИ:

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

ПОСТ:

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

Зверніть увагу, то POST починається при спробі прочитати значення з HttpURLConnection, наприклад responseCode, inputStream.textабо getHeaderField('...').


3
Проголосував за "нотатку", яка була ключовою. Дякую
xbmono

1
Це виглядає дуже просто. Що з обробкою винятків та обробкою ресурсів? Чи немає close()і disconnect()необхідне відкрите з'єднання? Чи є простий спосіб передати вміст файлу через вихідний потік http post?
CodingSamples

14

HTTPBuilder це. Дуже проста у використанні.

import groovyx.net.http.HTTPBuilder

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

Це особливо корисно, якщо вам потрібна обробка помилок і загалом більша функціональність, ніж просто отримання вмісту за допомогою GET.


Дякую @Dakota Brown - і ви можете підтвердити, що мені нічого не потрібно імпортувати?
smeeb

Це мінус, вам знадобиться банка: groovy.codehaus.org/modules/http-builder/download.html . У жолобному ядрі для цього нічого немає.
Dakota Brown

Дякую @Dakota Brown - будь ласка, дивіться мій коментар під відповіддю Will P - У мене таке саме питання до вас
smeeb

grails.org/plugin/rest дозволить вам використовувати HTTP Builder у проекті GRAILS
Dakota Brown

2
Не знаю, чому це проти. Хороше рішення, голосування.
Аудріус Мескаускас

1

Я не думаю, що http-builder є модулем Groovy, а скоріше зовнішнім API поверх http-клієнта apache, тому вам потрібно імпортувати класи та завантажувати купу API. Вам краще використовувати Gradle або @Grabзавантажити jar та залежності:

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

Примітка: оскільки сайт CodeHaus не працює, ви можете знайти JAR за адресою ( https://mvnrepository.com/artifact/org.codehaus.groovy.modules.http-builder/http-builder )


Я недостатньо знаю граалів, щоб відповісти, і я також не думаю, що це належить до погляду. Ви, ймовірно , краще , завантаживши залежності або використання URLвідповідно з @ відповідь Джона
Вілл

1
@smeeb @Grabбуде додано до grails-app/conf/BuildConfig.groovy. Тоді це буде працювати в контролерах, службах, ... - але, будь ласка, не додайте такий код у подання.
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
         }

     }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.