我在本地环境中安装了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
答案 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);
}
});