【问题标题】:Getting an empty response when calling CouchDB over ajax通过 ajax 调用 CouchDB 时得到一个空响应
【发布时间】:2011-01-31 00:39:14
【问题描述】:

我是 CouchDB 的新手,所以请多多包涵。

我有一个在 VM 上运行的 CouchDB 实例。我可以通过浏览器通过被褥访问它,也可以直接访问:

http://192.168.62.128:5984/articles/hot_dog

在浏览器中调用该 URL 会返回正确的 JSON。但是,当我尝试通过 ajax 调用完全相同的 URL 时,我什么也得不到:

var ajaxUrl = 'http://192.168.62.128:5984/articles/hot_dog';
$.getJSON(ajaxUrl, null, function(data) { alert(data); });

使用 Firebug 查看响应标头显示 HTTP 响应为 200,而 content-length 的大小正确。甚至 Etag 也与 CouchDB 中的内容相匹配。但是响应本身是empty

网址绝对正确;我已经三重检查,并直接复制/粘贴它(此外,如果不是,它不会给出 200 响应)。我正在使用 jQuery 1.4.2 和 CouchDB 0.8

发生了什么事?

【问题讨论】:

    标签: jquery ajax json couchdb


    【解决方案1】:

    当您尝试在您的 html 文件出现时从其他 Web 服务器获取数据时,您需要执行 JSONP 查询。首先,在最新版本的 CouchDB 中,您需要在配置 (.ini) 文件中启用 JSONP 查询。 (自 CouchDB 1.0 起默认禁用)在 [httpd] 部分中,您需要添加一个

    allow_jsonp = true

    完成此操作后,您可以在 CouchDB 上生成 JSONP 查询。

    在 jQuery 中你必须添加 ?callback=?到 URL 以触发 JSONP 查询。

    祝大家跨域资源共享愉快。

    【讨论】:

    • 为什么 jsonp 总是解决 cors 问题的答案?它是一个不错的短期解决方案,但对于良好的 REST 实践而言,从来都不是一个真正好的长期解决方案。
    • 同意贾斯汀的观点,CORS 变得可笑了。但是 loomi:CouchDB 服务器如何“允许”jsonp?它不知道浏览器使用什么来执行请求 - jsonp 只是一个 GET。或者该选项是否允许执行伪 PUT(JSONP 不允许)?
    【解决方案2】:

    听起来非常像您正在尝试发出跨域 AJAX 请求,浏览器将拒绝该请求。为了解决这个问题,您可以像上面的答案一样使用 JSONP,但这会将您限制为 GET 请求;您将无法添加、修改或删除记录。

    如果您尝试使用 CouchDB 进行跨域 AJAX 调用,我建议您查看这个库:

    http://github.com/benvinegar/couchdb-xd

    【讨论】:

    • 你完全正确,这是一个跨域问题。我最终使用了一个名为 CouchApp 的库将我的所有代码包装到 couchdb 中的附件中,因此不再存在跨域问题。不过,我也会看看你的图书馆。由于您比抖动“更”正确(而且他有因果报应:-p)我将您的回答标记为答案。谢谢!
    【解决方案3】:

    尝试像这样将callback=? 附加到网址。这将触发 jQuery 发出 jsonp 请求。

    var ajaxUrl = 'http://192.168.62.128:5984/articles/hot_dog?callback=?';
    

    如果这还不能解决问题,您应该在浏览器中附加此 url 提供的 json 的示例输出。

    【讨论】:

    • 好的,这与升级到沙发 0.10.1 相结合就成功了。谢谢!我仍然不知道为什么会发生这种情况......为什么没有 ?callback= ajax 调用不起作用?后缀?
    • 根据您在问题中所写的内容,我认为这不是跨域请求问题(由虚拟机内部(具有不同端口)或外部的网络服务器提供服务,两者都算作跨域请求并且应该被浏览器阻止)。添加callback 的东西使它成为jsonp 请求,基本上这只是一个猜测,我不熟悉CouchDB,所以不知道如果跨域不适用,为什么它不适用于普通的json请求.正如您提到的“升级”,我注意到(谷歌搜索)jsonp 支持仅随版本 0.10 提供,因此升级是正确的做法
    【解决方案4】:

    首先这是一个 json 问题,你已经标记了 jquery...

    如果你需要 jquery 那么...查找 load() 函数。

    $('#selector').load(ajaxURL); alert($('#selector').html())

    【讨论】:

    • 您所说的完全是错误的。从他对$.getJSON 的使用中可以看出他显然使用了jQuery。 load 也绝对是他想要的错误功能。所以这个问题被正确标记了,只有 json 作为标记丢失了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-07
    • 1970-01-01
    相关资源
    最近更新 更多