2010-07-30 5 views
11

Actuellement, l'application Web ont besoin d'offrir une sorte d'en-tête HTTP inter-domaines pour accéder aux données sur les autres domaines: http://openfontlibrary.org/wiki/Web_Font_linking_and_Cross-Origin_Resource_SharingAccès interdomaine CouchDB de XMLHttpRequest?

Est-il possible de configurer CouchDB pour faciliter l'accès inter-domaines illimité? (Il peut utiliser httpd apache en interne) J'utilise le but interne db seulement.

+0

Malheureusement, le lien est mort maintenant et renvoie une page d'erreur 404. – MKroehnert

+0

@MKroehnert Oh. Et ça me rend dingue que je ne puisse même pas me souvenir de ce que je voulais faire il y a trois ans. – Eonil

Répondre

8

Vous pouvez utiliser une fonction CouchDB show pour définir l'en-tête Access-Control-Allow-Origin.


function(doc, req) { 
    return { 
    body : 'whatever', 
    headers : { 
     "Access-Control-Allow-Origin": "\"*\"" 
    } 
    } 
} 

Plus d'informations sur les fonctions spectacle ici: http://guide.couchdb.org/draft/show.html

+0

cela ne supporte malheureusement pas POST, PUT et DELETE :(est-il un moyen de soutenir ces méthodes? –

14

La meilleure façon que je trouve pour le résoudre est à l'aide installé localement Apache Web Server avec permis Module mod_proxy et configuré ProxyPass directive.

Laisser commencer par la configuration de base

index.html a le contenu suivant

<html> 
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js" type="text/javascript"></script> 
<script type="text/javascript"> 

var http = XMLHttpRequest(); 
http.open('GET', 'http://127.0.0.1:5984/_all_dbs', true); // ! WE WILL CHANGE THIS LINE 
http.onreadystatechange = function() { 
    if (http.readyState == 4 && http.status == 200) { 
     console.debug('it works'); 
    } 
}; 
http.send(null) 
</script> 
<head><title>Test Access to CouchDB</title></head> 
<body> 
</body> 
</html> 

Si vous essayez tout à l'heure, il ne fonctionnera pas à cause du problème de domaine transversal (dans ces ports d'instance ne correspondent pas 8181! = 5984) .

Comment réparer

  • configure Apache (APACHE_HOME/conf/httpd.conf)
    • uncomment LoadModule proxy_module modules/mod_proxy.so
    • uncomment LoadModule proxy_http_module modules/mod_proxy_http.so
    • ajouter ProxyPass /couchdb http://127.0.0.1:5984 (comme propriété de haut niveau y comme ServerAdmin)
    • redémarrage Apache
  • modifier index.html
    • remplacer http.open('GET', 'http://127.0.0.1:5984/_all_dbs', true); avec http.open('GET', '/couchdb/_all_dbs', true);

Essayez maintenant et vous devriez voir 'cela fonctionne' sortie dans la console javascript (je Firebug Console)

3

Eonil, je veux L'accès inter-domaine aussi, mais n'est pas pris en charge par CouchDB, , vous pouvez voter pour cette fonctionnalité à implémenter ici: https://issues.apache.org/jira/browse/COUCHDB-431Ps: cette demande de fonctionnalité a été créée le 23/Jul/09 :(J'espère qu'ils nous entendront.

+0

Merci de me le faire savoir.J'ai voté! Je pense que la fonction de protocole HTTP REST est juste une des choses de sucre syntaxique Une fonctionnalité pratique devrait être offerte simultanément, mais je ne m'attends pas à ce que les gens de CouchDB le fassent parce que je suppose qu'ils font déjà des affaires qui n'ont pas besoin des utilisateurs réguliers, et je vous recommande de vérifier * OrientDB * aussi pour offrir une interface HTTP REST rapide et pratique, mais j'ai décidé de retourner à PostgreSQL – Eonil

+0

Merci, je ne connaissais pas OrientDB, sa liste de fonctionnalités semble très intéressante, dans mon cas, j'ai trouvé HTTP REST utile (ou requis) Comme je prévois d'accéder au stockage db à partir du navigateur client en utilisant jQuery, ce que je trouve le plus frustrant à propos de CouchDB est que les vues statiques utilisant MapReduce sont le seul mécanisme de requête! – Benja

1

La façon dont je l'ai résolu est d'écrire un wrapper Rebol 2 ligne CGI, puis demander à mon Ajax JQuery d'appeler mon CGI au lieu de l'URL pour obtenir des données de CouchDB:

Rebol [ 

    {wrapper to overcome cross-domain fetching of data from couchdb} 
] 
print "Content-type: application/json^/" ;text/plain^/" 
print read http://127.0.0.1:5984/syncspace/_design/vals/_view/xxxx?group=true 
1

J'ai fait une liste qui retourne jsonp ... mais lire encore soutenir que

"jsonp": "function(head, req) { 
    var row; 
    var rows=[]; 
    while(row = getRow()){ 
     rows.push(row); 
    } 
    rj = JSON.stringify({\"rows\" : rows,\"total_rows\":rows.length}); 
    return req.query.callback+\"(\"+rj+\");\"; 
}", 
4

CouchDB 1.3 résout ce avec CORS: https://wiki.apache.org/couchdb/CORS

+0

Avis de tout en installant couchdb sur debian/ubuntu via le gestionnaire de paquets. En date d'aujourd'hui (10-Oct-2014) la version que vous obtiendrez est 1.2 et elle ne supporte PAS les options CORS. Si vous voulez les utiliser, vous devez installer jamais la version des sources. Il m'a fallu un peu de temps pour comprendre pourquoi mes paramètres CORS ne fonctionnaient pas, et la raison en était que je l'ai installé via apt-get install couchdb et que c'était la version 1.2. – szydan

3

vous devez activer CORS in CouchDB> 1.3. Ceci est aussi simple que d'éditer votre default.ini et de régler enable_cors = true, puis de modifier origins sous la section [cors] pour avoir les URL de niveau supérieur dont vous avez besoin. Par exemple, je devais faire ce qui suit pour ajouter la liste blanche à mon serveur local.

enable_cors = true 
[cors] 
origins = http://127.0.0.1:9000 

pour répondre entièrement à cette question que vous voudriez mettre

origins = * 

bien que cela pourrait faire valoir comme une vulnérabilité, et vous devez limiter probablement les origines plus.

+0

Notez que vous avez installé couchdb sur debian/ubuntu via le gestionnaire de paquets. En date d'aujourd'hui (10-Oct-2014) la version que vous obtiendrez est 1.2 et elle ne supporte PAS les options CORS.Si vous voulez les utiliser, vous devez installer jamais la version des sources. Il m'a fallu un peu de temps pour comprendre pourquoi mes paramètres CORS ne fonctionnaient pas, et la raison en était que je l'ai installé via apt-get install couchdb et que c'était la version 1.2. – szydan