Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

LLClient: Add String flavored setEntity #30447

Merged
merged 9 commits into from
May 9, 2018
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions client/rest/src/main/java/org/elasticsearch/client/Request.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,10 @@

package org.elasticsearch.client;

import org.apache.http.entity.ContentType;
import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.nio.entity.NStringEntity;
import org.apache.http.nio.protocol.HttpAsyncResponseConsumer;

import java.util.Arrays;
Expand Down Expand Up @@ -103,6 +105,17 @@ public void setEntity(HttpEntity entity) {
this.entity = entity;
}

/**
* Set the body of the request to a string. If not set or set to
* {@code null} then no body is sent with the request. The
* {@code Content-Type} will be sent as {@code application/json}.
* If you need a different content type then use
* {@link #setEntity(HttpEntity)}.
*/
public void setEntity(String entity) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: call it setJsonEntity?

setEntity(entity == null ? null : new NStringEntity(entity, ContentType.APPLICATION_JSON));
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can we add a small unit test for this method?

}

/**
* The body of the request. If {@code null} then no body
* is sent with the request.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -168,10 +168,13 @@ public void onFailure(Exception exception) {
request.addParameter("pretty", "true");
//end::rest-client-parameters
//tag::rest-client-body
request.setEntity(new StringEntity(
request.setEntity(new NStringEntity(
"{\"json\":\"text\"}",
ContentType.APPLICATION_JSON));
//end::rest-client-body
//tag::rest-client-body-shorter
request.setEntity("{\"json\":\"text\"}");
//end::rest-client-body-shorter
//tag::rest-client-headers
request.setHeaders(
new BasicHeader("Accept", "text/plain"),
Expand Down
8 changes: 8 additions & 0 deletions docs/java-rest/low-level/usage.asciidoc
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,14 @@ IMPORTANT: The `ContentType` specified for the `HttpEntity` is important
because it will be used to set the `Content-Type` header so that Elasticsearch
can properly parse the content.

You can also set it to a `String` which will default to
a `ContentType` of `application/json`.

["source","java",subs="attributes,callouts,macros"]
--------------------------------------------------
include-tagged::{doc-tests}/RestClientDocumentation.java[rest-client-body-shorter]
--------------------------------------------------

And you can set a list of headers to send with the request:

["source","java",subs="attributes,callouts,macros"]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,8 @@

package org.elasticsearch.index.reindex.remote;

import org.apache.http.entity.ByteArrayEntity;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.lucene.util.BytesRef;
import org.apache.http.nio.entity.NStringEntity;
import org.elasticsearch.ElasticsearchException;
import org.elasticsearch.Version;
import org.elasticsearch.action.search.SearchRequest;
Expand Down Expand Up @@ -151,8 +149,7 @@ static Request initialSearch(SearchRequest searchRequest, BytesReference query,
}

entity.endObject();
BytesRef bytes = BytesReference.bytes(entity).toBytesRef();
request.setEntity(new ByteArrayEntity(bytes.bytes, bytes.offset, bytes.length, ContentType.APPLICATION_JSON));
request.setEntity(Strings.toString(entity));
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we support as well the method for bytes?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ha! Just saw your other comment.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

on this one I am on the fence. It is odd that we have to go from bytes to string here. I would rather leave what you had, or add a method to set a byte array, even if we are the only ones using it.

} catch (IOException e) {
throw new ElasticsearchException("unexpected error building entity", e);
}
Expand Down Expand Up @@ -199,15 +196,15 @@ static Request scroll(String scroll, TimeValue keepAlive, Version remoteVersion)

if (remoteVersion.before(Version.fromId(2000099))) {
// Versions before 2.0.0 extract the plain scroll_id from the body
request.setEntity(new StringEntity(scroll, ContentType.TEXT_PLAIN));
request.setEntity(new NStringEntity(scroll, ContentType.TEXT_PLAIN));
return request;
}

try (XContentBuilder entity = JsonXContent.contentBuilder()) {
entity.startObject()
.field("scroll_id", scroll)
.endObject();
request.setEntity(new StringEntity(Strings.toString(entity), ContentType.APPLICATION_JSON));
request.setEntity(Strings.toString(entity));
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we support the method for XContent as well?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

low-level client doesn't depend on xcontent, we can't do that

} catch (IOException e) {
throw new ElasticsearchException("failed to build scroll entity", e);
}
Expand All @@ -219,14 +216,14 @@ static Request clearScroll(String scroll, Version remoteVersion) {

if (remoteVersion.before(Version.fromId(2000099))) {
// Versions before 2.0.0 extract the plain scroll_id from the body
request.setEntity(new StringEntity(scroll, ContentType.TEXT_PLAIN));
request.setEntity(new NStringEntity(scroll, ContentType.TEXT_PLAIN));
return request;
}
try (XContentBuilder entity = JsonXContent.contentBuilder()) {
entity.startObject()
.array("scroll_id", scroll)
.endObject();
request.setEntity(new StringEntity(Strings.toString(entity), ContentType.APPLICATION_JSON));
request.setEntity(Strings.toString(entity));
} catch (IOException e) {
throw new ElasticsearchException("failed to build clear scroll entity", e);
}
Expand Down