2016-04-03 5 views
0

Ich habe angefangen, mit Lucidworks Fusion (2.1.2) zu arbeiten und am bequemsten zu hacken mit Groovy. Randnotiz: Python 'Anfragen' behandelt dies nahtlos, aber ich bin stur und möchte nicht Python verwenden ...Wie kann ich mit groovy eine Verbindung zur Lucidworks Fusion (Solr Wrapper) API herstellen?

Fusion hat vielversprechende API, auf die ich freue mich auf die Arbeit mit Groovy.

Wie verbinde ich mich am besten mit der Fusion authentifizierten API in Fusion mit Groovy (auf eine groovy-ish Art)?

Ich habe mehrere Ansätze ausprobiert (und schließlich ein paar gefunden, als gearbeitet). Ich begrüße das Feedback, warum die grundlegende nicht funktioniert für mich, zusammen mit anderen "einfachen" Lösungen.

Hier ist, was ich versucht:

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

, die mit einem 401 unauthorized ausfällt (wegen der Codierung glaube ich). HTTPBuilder kam von gradle:

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

ich auch versucht:

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

und bekam:

{"code":"unauthorized"} 

auch versucht:

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" 
} 

die warf (heute erwartet) IOError: 401. Wenn jemand mehr will Wegen meiner Misserfolge lassen Sie es mich wissen und ich kann Sie wahrscheinlich mit umfangreichen technischen Details langweilen.

Ich beantworte schamlos meine eigene Frage (unten), hoffe aber, dass einige groovige Sensei da draußen mich ein wenig aufklären können.

Also zur Erinnerung: Gibt es eine bessere/groovierere Lösung als das, was ich unten gefunden habe?

Antwort

0

Also habe ich die Frage gestellt und schreibe die Lösung (en), die ich gefunden habe. Hoffentlich werden die Leute bessere Lösungen hinzufügen und vielleicht sogar erklären, was ich bei meinen ersten Versuchen verpasst habe.

Hier ist meine bevorzugte Lösung ist (alle drei Lösungen sind unten aus googeln, aber ich die Links verloren, fühlen sich frei, mich zu stoßen und ich werde sie graben - ein dickes Lob an Original-Plakate):

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" 

Und eine andere Arbeitslösung:

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

und für diejenigen, halten zu Hause Score, eine python-Lösung zum Vergleich:

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 

HTH,

Sean