【问题标题】:Elasticsearc CORS despairElasticsearch CORS 绝望
【发布时间】:2018-04-19 15:22:33
【问题描述】:

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

这是来自浏览器的结果:代码 POST 200 OK

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

响应文本:""
xhr.statusText:"错误"
成功:空

您能帮我在我的 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

跨域:真,

并从 .yml 中删除:

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

我收到这条消息:

无法加载http://localhost:9200/_search:否 请求中存在“Access-Control-Allow-Origin”标头 资源。因此不允许使用原点“http://localhost:90” 访问。

这是对应的响应头:

HTTP/1.1 200 OK 警告:299 Elasticsearch-5.6.3-1a2f265“内容类型 不推荐检测休息请求。指定内容类型 使用 [Content-Type] 标头。" "2017 年 11 月 7 日星期二 11:51:24 GMT" 内容类型:应用程序/json; charset=UTF-8 内容编码:gzip 内容长度:6898

插入 contentType 后(已测试):

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

我收到这个新错误:

无法加载http://localhost:9200/_search:对预检的响应 请求未通过访问控制检查:否 'Access-Control-Allow-origin' 标头出现在请求的 资源。因此,现在允许使用 Origin 'http://localhost:90' 访问。

但我的 elasticsearch.yml 包含:

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

【问题讨论】:

  • crossDomain: true 对您没有帮助。即使没有跨域请求,这也会模拟一个跨域请求。阅读 jQuery ajax 文档以了解此选项是什么。真的,您只希望它用于测试/模拟目的。
  • 但是无论如何,如果你得到 200 OK 响应,那么它不是 CORS 错误。如果出现 CORS 错误,您甚至不会得到响应。 (除非 200 是对飞行前 OPTIONS 请求的响应,而不是您的实际请求??在这种情况下,您应该在大多数浏览器中看到控制台错误。)。或者您的响应中的 JSON 可能无效 - 请让我们看看您的响应是什么样的?
  • 感谢您的回复。是的,这是我的第二个想法:错误的回报。我会在几分钟内粘贴它:)
  • 刚刚注意到http.cors.allow-methods: X-Requested-With, Content-Type, Content-Length 也没有任何意义。这应该指定 HTTP 方法的列表(例如 GET、POST、HEAD、OPTIONS 等),而不是其他允许的标头列表。请参阅elastic.co/guide/en/elasticsearch/reference/current/… 了解可用选项,以及此选项的默认设置。
  • 您的示例也有语法错误:success: function(data): {console.log(data)} }, 必须是 success: function(data) {console.log(data) }, 。不确定这是否反映了您的真实代码。

标签: jquery ajax http elasticsearch cors


【解决方案1】:

我终于解决了我的问题!感谢您 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);
    }
});

【讨论】:

    猜你喜欢
    • 2016-01-25
    • 2019-04-25
    • 2020-11-16
    • 2018-11-16
    • 2012-02-22
    • 1970-01-01
    • 2023-01-09
    • 2019-01-04
    • 1970-01-01
    相关资源
    最近更新 更多