使用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有关:分块。
谢谢
答
对不起,打扰。答案确实是缺少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"
为什么你要发送“var data = JSON.stringify(postData);”在字符串格式?而是以data:postData的形式发送Object。 – Shiladitya
然后ElasticSearch返回一个错误406:“不支持Content-Type头[application/x-www-form-urlencoded; charset = UTF-8]”。和contentType:“application/json; charset = utf-8”ES返回一个空的结果。 – Sven
我仍然认为问题在于构建postData。请检查ElasticSearch中的日志,它将为您提供从UI中触发的确切查询。除此之外,请添加Content-Type:application/json; – Shiladitya