0

私は Lucidworks Fusion (2.1.2) で作業を開始し、 Groovyで最も快適にハッキングできます。補足: Python の「リクエスト」はこれをシームレスに処理しましたが、私は頑固で Python を使いたくありません...

Fusion には有望なAPIがあり、Groovy で使用できることを楽しみにしています。

Groovy を使用して (Groovy っぽい方法で) Fusion で Fusion 認証済み API に接続するにはどうすればよいですか?

私はいくつかのアプローチを試しました(そして最終的にうまくいくものをいくつか見つけました)。基本的な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 がスローされました。私の失敗に関する詳細情報が必要な場合は、私に知らせてください。膨大な量の技術的な詳細であなたを退屈させる可能性があります。

私は恥知らずに自分の質問 (以下) に答えていますが、そこにいるグルーヴィーな先生が私を少し啓発できることを願っています.

要約すると、以下で見つけたものよりも優れた/グルーヴィーなソリューションはありますか?

4

1 に答える 1

0

だから私は質問をし、私が見つけた解決策を投稿しています。うまくいけば、人々はより良​​い解決策を追加し、最初の試みで見逃したことを説明してくれるかもしれません.

これが私の好みの解決策です(以下の3つの解決策はすべてグーグルからのものですが、リンクを失いました。お気軽に突っ込んでください。元のポスターに敬意を表します):

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

HTH、

ショーン

于 2016-04-03T02:38:33.740 に答える