使用application/json将$ .ajax复制到Elasticsearch后没有成功回调

问题描述:

我遇到了成功使用从jQuery ElasticSearch服务器检索到的应用程序/ json答案的问题。 Firefox告诉我,我得到了一个有效的200 OK的HTTP GET答案,Firefox网络监视器可以正确解析JSON。但是jQuery不会调用成功/完成回调,只会失败并始终被调用。

ElasticSearch告诉我一个警告头:

299 Elasticsearch-5.4.1-未知“的内容类型检测休息的请求已被弃用指定使用[内容类型]标头中的内容类型。 “ “星期一,2017年7月3日7时59分32秒GMT”

只要我添加

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

到$阿贾克斯()函数,Elasticsearch只返回一个空的结果。

为 “有效”,而不是回调调用版本的JS代码:

var postData = { 
     "_source": ['title', 'url'], 
     "query" : { 
      "match": { 
       "body": "lorem" 
      } 
     }, 
     "highlight" : { 
      "pre_tags" : ["<b>"], 
      "post_tags" : ["</b>"], 
      "fields" : { 
       "body" : { 
        "fragment_size" : 150, 
        "number_of_fragments" : 1, 
        "no_match_size": 150 
       } 
      } 
     } 
    }; 
    function docsearch(){ 
    var data = JSON.stringify(postData); 
    $.ajax({ 
     //contentType:"application/json; charset=utf-8", 
     url: "http://127.0.0.1:9200/myindex/_search?pretty=true", 
     type: "POST", 
     dataType: "json", 
     data: data, 
     success: function (data) { console.log(data); } 
    }).done(function() { 
     alert("success"); 
    }) 
    .fail(function(data) { 
     console.log(data); 
    }) 
    .always(function() { 
     alert("complete"); 
    }); 
    }; 

的GET头:

Host: 127.0.0.1:9200 
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0 
Accept: application/json, text/javascript, */*; q=0.01 
Accept-Language: en-US,en;q=0.5 
Accept-Encoding: gzip, deflate 
Referer: http://localhost/ 
Content-Type: application/x-www-form-urlencoded; charset=UTF-8 
Content-Length: 208 
Origin: http://localhost 
DNT: 1 
Connection: keep-alive 

,并导致头部:

Content-Encoding: gzip 
Content-Type: application/json; charset=UTF-8 
Transfer-Encoding: chunked 
Warning: 299 Elasticsearch-5.4.1-Unknown "Content type detection for rest requests is deprecated. Specify the content type using the [Content-Type] header." "Mon, 03 Jul 2017 07:59:32 GMT" 

而结果JSON:

{ 
    "took" : 3, 
    "timed_out" : false, 
    "_shards" : { 
    "total" : 5, 
    "successful" : 5, 
    "failed" : 0 
    }, 
    "hits" : { 
    "total" : 1, 
    "max_score" : 0.25124598, 
    "hits" : [ 
     { 
     "_index" : "myindex", 
     "_type" : "post", 
     "_id" : "10", 
     "_score" : 0.25124598, 
     "_source" : { 
      "title" : "Lorem ipsum" 
     }, 
     "highlight" : { 
      "body" : [ 
      "<b>Lorem</b> ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat" 
      ] 
     } 
     } 
    ] 
    } 
} 

的失败回调的输出:

09:59:32.973 Object { readyState: 0, getResponseHeader: .ajax/y.getResponseHeader(), getAllResponseHeaders: .ajax/y.getAllResponseHeaders(), setRequestHeader: .ajax/y.setRequestHeader(), overrideMimeType: .ajax/y.overrideMimeType(), statusCode: .ajax/y.statusCode(), abort: .ajax/y.abort(), state: .Deferred/e.state(), always: .Deferred/e.always(), catch: .Deferred/e.catch(), 9 more… } 

任何人都可以提供一些见解,为什么jQuery是不是调用成功功能?我发现它可能与Transfer-Encoding有关:分块。

谢谢

+0

为什么你要发送“var data = JSON.stringify(postData);”在字符串格式?而是以data:postData的形式发送Object。 – Shiladitya

+0

然后ElasticSearch返回一个错误406:“不支持Content-Type头[application/x-www-form-urlencoded; charset = UTF-8]”。和contentType:“application/json; charset = utf-8”ES返回一个空的结果。 – Sven

+0

我仍然认为问题在于构建postData。请检查ElasticSearch中的日志,它将为您提供从UI中触发的确切查询。除此之外,请添加Content-Type:application/json; – Shiladitya

对不起,打扰。答案确实是缺少Access-Control-Allow-Origin标头。因为它是一个POST,所以它也需要被允许:

Header set Access-Control-Allow-Origin "http://elasticsearch-host.domain" 
Header set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT"