【发布时间】:2019-05-08 11:28:14
【问题描述】:
我正在尝试通过以下代码调用 API。但我的浏览器是 给出同样的错误,服务器没有响应。
我的 API 运行良好,我通过邮递员进行了测试。 我不知道我哪里错了
我也试过放一些标题内容类型
应用程序/json, application/x-javascript , 应用程序/javascript, 文本/json
function send(text) {
$.ajax({
url: 'http://localhost:5005/conversations/default/respond',
type: 'POST',
dataType:'jsonp',
headers: {
'Content-Type': 'application/javascript'
},
data: //JSON.stringify({
{
"q": text
},//),
success: function (data, textStatus, xhr) {
console.log(data);
if (Object.keys(data).length !== 0) {
for (i = 0; i < Object.keys(data[0]).length; i++) {
if (Object.keys(data[0])[i] == "buttons") { //check if buttons(suggestions) are present.
addSuggestion(data[0]["buttons"])
}
}
}
setBotResponse(data);
},
error: function (xhr, textStatus, errorThrown) {
console.log('Error in Operation');
setBotResponse('error');
}
});
【问题讨论】:
-
也许你需要
dataType: 'json'而不是dataType: 'jsonp'和 Content-Type: application/json -
你必须使用 JSONP 吗?我宁愿使用普通的 JSON 并使用实际的跨源标头修复跨源问题,而不是使用 JSONP 而不是 JSON。在旧的服务器/操作系统上,我确实必须将“application/json”添加到 MIME 类型列表中才能真正使用 json。因此,如果您打算在旧系统上使用 jsonp 或 json,请确保您的客户端和服务器都知道您的 MIME 类型的含义。
-
JSONP 调用的返回格式不是 JSON,而是 JavaScript。 (JSONP = JSON with padding,而 padding 是指一个 JS 函数包装器,用于将响应 JSON 加载到本地或全局变量中)
-
@sheel 这正是我所说的“使用实际的跨源标头修复跨源问题”的意思。只需在您最喜欢的搜索引擎或 SO 上查找 CORS javascript 并实现它,这样您就可以使用普通的 JSON 并且问题消失了。在我们能够正确配置 CORS 之前,JSONP 是跨源问题的解决方案,但现在它大多已经过时了。
-
@sheel 这可能相当复杂,所以其他教程会更好地解释它。简而言之:在响应调用的服务器上,API,您必须配置响应标头,以便它们返回值为 true 的
Access-Control-Allow-Headers。和Access-Control-Allow-Origin,包含您的客户端发出请求的域的值。您还必须确保 API 实际上允许发出 HEAD 请求。根据服务器的不同,您可能还需要添加Access-Control-Allow-Credentials。
标签: javascript json ajax rasa-nlu