Elasticsearc CORS绝望

时间:2017-11-07 09:31:48

标签: jquery ajax http elasticsearch cors

我在本地环境中安装了ES5.4,并尝试使用ajax请求(使用jQuery)从我的Web浏览器向API发出请求,并且CORS策略打破了它。

我阅读了ES HTTP documentation和一些论坛,但我无法解决我的问题。

这是我的elasticsearch.yml http conf:

http.port: 9200
http.cors.allow-origin: "*"
http.cors.allow-methods: X-Requested-With, Content-Type, Content-Length
http.cors.enabled: true
network-host: localhost

以下是我的请求参数:

// simple query string 
var queryFilter = {
  "query": {
    "match":  {
      "id_opp":"OPP_4"
    }
  }
};

jQuery.support.cors = true;

$.ajax({
  type: "POST",
  url: "http://localhost:9200/_search",
  crossDomain: true,
  data: JSON.stringify(queryFilter),
  dataType: "json",
  success: function(data): {console.log(data)}
  }, 
  error: function(xhr){console.log(xhr)}
);

这是浏览器的结果:Code POST 200 OK

在浏览器网络工具中,我在结果中得到了一些对象,它很好,但我的JavaScript代码将ajax结果读作失败:

  

responseText的:""
  xhr.statusText:"错误"
  成功:null

你能帮助我在我的ajax请求中取得成功吗?

她是我的回答:

{
    "took": 33,
    "timed_out": false,
    "_shards": {
        "total": 10,
        "successful": 10,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 6,
        "max_score": 1.2438203,
        "hits": [{
                "_index": "opportunites",
                "_type": "opportunity",
                "_id": "OPP_4-10_LT_26173_MCHE_002",
                "_score": 1.2438203,
                "_source": {
                    "@version": "1",
                    "id_opp": "OPP_4-10_LT_26173_MCHE_002",
                    "@timestamp": "2017-11-03T16:17:24.852Z",                    
                    "commune": "CHARPEY"
                }
            },
        }]
}
}

删除后使用Chrome

  

crossDomain:true,

并从.yml中删除:

  

http.cors.allow-methods:X-Requested-With,Content-Type,   内容长度

我收到此消息:

  

无法加载http://localhost:9200/_search:否   '访问控制允许来源'标题出现在请求的上   资源。起源' http://localhost:90'因此是不允许的   访问。

这是相应的响应标题:

  

HTTP / 1.1 200 OK警告:299 Elasticsearch-5.6.3-1a2f265"内容类型   不推荐检测休息请求。指定内容类型   使用[Content-Type]标题。" "周二,2017年11月7日11:51:24 GMT"   content-type:application / json; charset = UTF-8 content-encoding:gzip   内容长度:6898

插入contentType(已测试)后:

  

contentType:" application / json; charset = UTF-8",

我收到了这个新错误:

  

无法加载http://localhost:9200/_search:对预检的响应   请求未通过访问控制检查:否   '访问控制允许来源'标题出现在请求的上   资源。起源' http://localhost:90'因此现在是允许的   访问。

但我的elasticsearch.yml包含:

  

http.cors.allow-origin:" *" http.cors.enabled:true

1 个答案:

答案 0 :(得分:0)

最终我解决了我的问题!感谢 ADyson 的支持;)

这是我的http配置(elasticsearch.yml):

http.port:9200
http.cors.allow-origin: "*"
http.cors.allow-methods: Origin, X-Requested-With, Content-Type, Content-length, Accept
http.cors.enabled: true

这是我的JavaScript代码,用于请求弹性搜索数据:

jQuery.support.cors = true;
// execute request
$.ajax({
    type: "POST",
    url: "http://localhost:9200/_search",
    data: JSON.stringify(queryFilter), // elastic filter
    dataType: "json",
    contentType: "application/json;charset=UTF-8",
    processData: false,
    success: function(data) {
        console.log(data)
    },
    error: function(xhr, ajaxOptions, thrownError) {
        console.log(xhr);
    }
});