2016-03-17 3 views
0

У меня есть этот код:Отправка запроса POST с HTTPBuilder, не дожидаясь ответа

ApiConsumer(String url) { 
    this.baseUrl = url 
    this.httpBuilder = initializeHttpBuilder() 
    this.cookies = [] 
} 

private HTTPBuilder initializeHttpBuilder() { 
    def httpBuilder = new HTTPBuilder(baseUrl) 
    httpBuilder.handler.success = { HttpResponseDecorator resp, reader -> 
     resp.getHeaders('Set-Cookie').each { 
      String cookie = it.value.split(';')[0] 
      cookies.add(cookie) 
     } 
     return convertPlain("${reader}") 
    } 
    return httpBuilder 
} 

public def requestXML(Method method, ContentType contentType, String url, String bodyXML) { 
    httpBuilder.parser.'application/xml' = httpBuilder.parser.'text/plain' 
    httpBuilder.request(method, contentType) { request -> 
     uri.path = url 
     body = bodyXML 
     headers['Cookie'] = cookies.join(';') 
    } 
} 

В принципе, с requestXML(...) он отправляет запрос XML на указанный URL с помощью HTTPBuilder для Groovy. Я использую этот код (с другими второстепенными функциями) для отправки запроса службе, и он работает. Но теперь я хочу повторно использовать его, чтобы сделать запрос POST другой службе, которая отвечает примерно через 30 минут, потому что эта служба WPS запускает программу и ждет ее завершения. Как я могу отправить этот запрос POST, не дожидаясь ответа?

Мне нужно настроить таймаут? Я попытался снять крышку httpBuilder.handler.success без успеха. Также я не могу изменить способ обработки запроса WPS-сервисом.

ответ

0

Попробуйте использовать AsyncHttpBulder, как описано здесь:

Groovy AsyncHttpBulder

Например:

import groovyx.net.http.AsyncHTTPBuilder 
import static groovyx.net.http.ContentType.HTML 

def http = new AsyncHTTPBuilder(
      poolSize : 4, 
      uri : 'http://hc.apache.org', 
      contentType : HTML) 


def result = http.get(path:'/') { resp, html -> 
    println ' got async response!' 
    return html 
} 

assert result instanceof java.util.concurrent.Future 

while (! result.done) { 
    println 'waiting...' 
    Thread.sleep(2000) 
} 

/* The Future instance contains whatever is returned from the response 
    closure above; in this case the parsed HTML data: */ 
def html = result.get() 
assert html instanceof groovy.util.slurpersupport.GPathResult 
Смежные вопросы