Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sending requests to Elasticsearch with axios

I'm working on a react app which needs to fetch data from elsaticsearch. In frontend, actually I'm trying to use axios to do the request:

const query = {
  query: {
    match: {
      "_id": "AV12n5KzsohD5gXzTnOr"
    }
  }
};

axios.get('http://localhost:9200/my-index/my-type/_search', query)
  .then((res) => {
    console.log(res);
  });

I want to get the specific document with some ID. The above query actually works inside kibana. However, the above query returns all the documents inside my-type, what am I doing wrong here?

like image 319
nicemayi Avatar asked Jul 25 '17 00:07

nicemayi


1 Answers

I think the below should work. Although the Axios README says that data is specifically only for PUT, POST, and PATCH requests, I didn't see anything in the code that enforces this, and a simplified test shows that the request body is indeed sent for GET requests:

axios.get('http://localhost:9200/my-index/my-type/_search', {
  data: JSON.stringify(query),
}).then((res) => {
  console.log(res);
});

EDIT

Note that I've only tested this in Node.js, not in a browser. Browsers may be less inclined to include request bodies with GET requests.

EDIT 2

Elasticsearch seems to allow sending the request body in a parameter instead, perhaps because of this very issue.

This should do the trick:

axios.get('http://localhost:9200/my-index/my-type/_search', {
  params: {
    source: JSON.stringify(query),
    source_content_type: 'application/json'
  }
}).then((res) => {
  console.log(res);
});

EDIT 3

This does indeed seem to be a general restriction on making GET requests in browsers. Per the documentation for XMLHttpRequest.send:

If the request method is GET or HEAD, the argument is ignored and request body is set to null.

like image 119
user94559 Avatar answered Oct 02 '22 08:10

user94559