Как я могу использовать groovy для подключения к API Lucidworks Fusion (solr wrapper)?

Я начал работать с Lucidworks Fusion (2.1.2) и мне удобнее всего работать с Groovy. Примечание: запросы Python обрабатывали это без проблем, но я упрям ​​и не хочу использовать Python...

У Fusion есть многообещающий API, с которым я надеюсь работать в Groovy.

Как лучше всего подключиться к аутентифицированному API Fusion в Fusion с помощью Groovy (в стиле groovy-ish)?

Я перепробовал несколько подходов (и, наконец, нашел несколько, чем работал). Я приветствую отзывы о том, почему базовый RESTClient не работает для меня, наряду с другими "простыми" решениями.

Вот что я попробовал:

groovyx.net.http.HTTPBuilder hb = new HTTPBuilder(FUSION_API_BASE)
hb.auth.basic(user, pass)

Это терпит неудачу с 401 несанкционированным (из-за кодировки, я верю). HTTPBuilder пришел из Gradle:

compile 'org.codehaus.groovy.modules.http-builder:http-builder:0.7.1'

Я также попробовал:

HttpPost httpPost = new HttpPost(url);
List <NameValuePair> nvps = new ArrayList <NameValuePair>();
nvps.add(new BasicNameValuePair("username", "sean"));
nvps.add(new BasicNameValuePair("password", "mypass"));
httpPost.setEntity(new UrlEncodedFormEntity(nvps));
CloseableHttpResponse response2 = httpclient.execute(httpPost);

и получил:

{"code":"unauthorized"}

Также попробовал:

String path = '/api/apollo/introspect'
URL url = new URL('http', 'corp', 8764, path)
try {
    def foo = url.getContent()
    log.info "Foo: $foo"
} catch (IOException ioe){
    log.warn "IO ERR: $ioe"
}

который вызвал (теперь ожидаемый) IOError: 401. Если кто-то хочет получить больше информации о моих неудачах, дайте мне знать, и я, вероятно, утомлю вас обширными техническими подробностями.

Я беззастенчиво отвечаю на свой вопрос (ниже), но надеюсь, что какой-то отличный сенсей может немного просветить меня.

Итак, резюмируем: есть ли лучшее / более подходящее решение, чем то, что я нашел ниже?

1 ответ

Поэтому я задал вопрос и размещаю решение (я), которое я нашел. Надеюсь, что люди добавят лучшие решения и, возможно, даже объяснят, что я пропустил в моих первых попытках.

Вот мое предпочтительное решение (все три решения ниже от поиска в Google, но я потерял ссылки, не стесняйтесь ткнуть меня, и я выкопаю их - слава оригинальным постерам):

String furl = "${FUSION_API_BASE}${path}" //http://localhost:8764/api/apollo/introspect
RESTClient rc = new RESTClient(furl)
rc.headers['Authorization'] = 'Basic ' + "$user:$pass".bytes.encodeBase64()
//rc.headers['Authorization'] = 'Basic ' + "$user:$pass".getBytes('iso-8859-1').encodeBase64()
def foo = rc.get([:])
log.info "Foo: $foo"

И еще одно рабочее решение:

RESTClient rest = new RESTClient( 'http://localhost:8764/' )
HttpClient client = rest.client
client.addRequestInterceptor(new HttpRequestInterceptor() {
    void process(HttpRequest httpRequest, HttpContext httpContext) {
        httpRequest.addHeader('Authorization', 'Basic ' + 'sean:mypass'.bytes.encodeBase64().toString())
    }
})
def resp = rest.get( path : path)
assert resp.status == 200  // HTTP response code; 404 means not found, etc.
println resp.getData()

А для тех, кто ведет счет дома, решение для сравнения на python:

import requests
from requests.auth import HTTPBasicAuth
rsp = requests.get('http://corp:8764/api/apollo/introspect', auth=HTTPBasicAuth('sean', 'lucid4pass'))
print "Response ok/status code: %s/%s", rsp.ok, rsp.status_code
print "Response content: %s", rsp.content

НТН,

Шон

Другие вопросы по тегам