我正在研究一个将通过RESTful API与服务器通信的chrome应用程序.
如果不将服务器URL添加到manifest.json中的权限,我可以看到Chrome使用origin标头(chrome-extension:// cpndc ....)发送所有请求,如果这些请求中的任何一个具有非标准标头,则还会发送预检OPTIONS请求 - 这一切都符合预期.
将域添加到权限后,不再发送预检OPTIONS.原始标头在GET调用中不存在,但它仍然存在于POST,PATCH和MERGE调用中.
这会导致问题,因为我将使用的服务器上的CORS实现假定带有origin头的请求是CORS请求并且因为它不喜欢原点而响应403错误 - 这个带有chrome扩展的源不在接受的源列表中.
根据CORS规范,期望原始标头只应添加在跨域请求https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS#Origin中,但由于服务器域已添加到权限,我希望不仅GET而且其他请求都没有.
问题是:这是Chrome Apps CORS实施中的错误吗?
使用Chrome应用时我的调查结果摘要:
如果端点URL未添加到清单文件中的权限(CORS将启动): - Chrome应用程序在所有类型的请求中发送原始标头 - Chrome应用程序为具有非标准标头的所有请求发送OPTIONS预检
如果端点URL已添加到清单文件中的权限(对该域的请求的安全性已关闭) - Chrome应用程序不再发送OPTIONS预检(按预期方式) - Chrome应用程序仅在非GET请求中发送原始标头(不应该发送原点)
权限文件示例:
"permissions": [
"http://api.randomuser.me/*"
Run Code Online (Sandbox Code Playgroud)
]
示例应用代码:
window.onload = function() {
function get(){
var xhr = new XMLHttpRequest();
xhr.open("GET", "http://api.randomuser.me/?seed=bigFish", true);
xhr.setRequestHeader('Authn', 'abcdefghijklmnopqrstuvxyz');
xhr.onload = function (e) {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
console.log(xhr.responseText);
} else {
console.error(xhr.statusText);
}
post();
}
};
xhr.onerror = function (e) {
console.error(xhr.statusText); …Run Code Online (Sandbox Code Playgroud) 在第一个示例(http://docs.couchdb.org/en/1.6.1/couchapp/views/collation.html#views-collation)下的CouchDB官方文档的View Collation章节中,建议它是不建议在视图中发出文档本身,而是建议在请求视图时包含文档的主体,方法是请求视图?include_docs=true.
如果我理解正确,而不是:
emit(doc._id, doc);
Run Code Online (Sandbox Code Playgroud)
并以下列格式获得结果:
{"id":"1","key":"1","value":{"_id": "1", "someProp": "someVal"}},
Run Code Online (Sandbox Code Playgroud)
建议发送带有空值的emits:
emit(doc._id, null)
Run Code Online (Sandbox Code Playgroud)
然后在使用include_docs参数查询我的视图时,获取以下格式的结果:
{
"id": "1",
"key": "1",
"value": null,
"doc": {
"_id": "1",
"_rev": "1-0eee81fecb5aa4f51e285c621271ff02",
"someProp": "someVal"
}
Run Code Online (Sandbox Code Playgroud)
如果有人建议,那么我认为其性能会更好,但不幸的是文档没有详细说明为什么和其他示例通常将文档作为值发布.任何人都可以对此有所了解吗?