2016-04-03 4 views
0

Я начал работать с Lucidworks Fusion (2.1.2), и мне удобнее взломать Groovy. Боковое замечание: запросы python обрабатываются без проблем, но я упрям ​​и не хочу использовать python ...Как я могу использовать groovy для подключения к API-интерфейсу Lucidworks Fusion (solr wrapper)?

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. Если кто-то хочет больше в fo на моих неудачах, дайте мне знать, и я, скорее всего, утомляю вас объемными техническими деталями.

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

Итак, чтобы наброситься: есть ли лучшее решение/groovier, чем то, что я нашел ниже?

ответ

0

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

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

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() 

И для тех, которые держат счет дома, питон решение для сравнения:

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 

НТН,

Шон