執行請求
一旦建立了RestClient
,就可以通過呼叫performRequest
或performRequestAsync
來傳送請求,performRequest
是同步的,將阻塞呼叫執行緒並在請求成功時返回Response
,如果失敗則丟擲異常。performRequestAsync
是非同步的,它接受一個ResponseListener
引數,它在請求成功時呼叫Response
,如果失敗則呼叫Exception
。
這是同步的:
Request request = new Request(
"GET",
"/");
Response response = restClient.performRequest(request);
- 第一個引數:HTTP方法(
GET
,POST
,HEAD
等)。 - 第二個引數:伺服器上的端點。
這是非同步的:
Request request = new Request(
"GET",
"/");
restClient.performRequestAsync(request, new ResponseListener() {
@Override
public void onSuccess(Response response) {
}
@Override
public void onFailure(Exception exception) {
}
});
-
onSuccess
方法:處理響應。 -
onFailure
:處理失敗。
你可以將請求引數新增到請求物件:
request.addParameter("pretty", "true");
你可以將請求的body設定為任何HttpEntity
:
request.setEntity(new NStringEntity(
"{"json":"text"}",
ContentType.APPLICATION_JSON));
為
HttpEntity
指定的ContentType
很重要,因為它將用於設定Content-Type
header,以便Elasticsearch可以正確解析內容。
你還可以將其設定為String
,預設為ContentType
為application/json
。
request.setJsonEntity("{"json":"text"}");
RequestOptions
RequestOptions
類儲存應在同一應用程式中的多個請求之間共享的部分請求,你可以建立單例例項並在所有請求之間共享它:
private static final RequestOptions COMMON_OPTIONS;
static {
RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
builder.addHeader("Authorization", "Bearer " + TOKEN);
builder.setHttpAsyncResponseConsumerFactory(
new HeapBufferedResponseConsumerFactory(30 * 1024 * 1024 * 1024));
COMMON_OPTIONS = builder.build();
}
-
builder.addHeader
:新增所有請求所需的任何header。 -
builder.setHttpAsyncResponseConsumerFactory
:自定義響應消費者。
addHeader
用於授權或在Elasticsearch前使用代理所需的header,無需設定Content-Type
header,因為客戶端將自動從附加到請求的HttpEntity
設定該header。
你可以設定NodeSelector
來控制哪些節點將接收請求。
NodeSelector.NOT_MASTER_ONLY
是一個不錯的選擇。
你還可以自定義用於緩衝非同步響應的響應消費者,預設消費者將在JVM堆上緩衝最多100MB的響應,如果響應較大,則請求將失敗。例如,如果你在堆約束環境(如上面的例子)中執行,則可以降低可能有用的最大大小。
建立單例後,你可以在發出請求時使用它:
request.setOptions(COMMON_OPTIONS);
你還可以根據請求自定義這些選項,例如,這會新增額外的header:
RequestOptions.Builder options = COMMON_OPTIONS.toBuilder();
options.addHeader("cats", "knock things off of other things");
request.setOptions(options);
多個並行非同步操作
客戶端很樂意並行執行許多操作,以下示例並行索引許多文件,在現實世界的場景中,你可能希望使用_bulk
API,但示例是作例證的。
final CountDownLatch latch = new CountDownLatch(documents.length);
for (int i = 0; i < documents.length; i++) {
Request request = new Request("PUT", "/posts/doc/" + i);
//let`s assume that the documents are stored in an HttpEntity array
request.setEntity(documents[i]);
restClient.performRequestAsync(
request,
new ResponseListener() {
@Override
public void onSuccess(Response response) {
latch.countDown();
}
@Override
public void onFailure(Exception exception) {
latch.countDown();
}
}
);
}
latch.await();
-
onSuccess
:處理返回的響應。 -
onFailure
:由於通訊錯誤或帶有指示錯誤的狀態碼的響應,處理返回的異常。