Zugriff auf CouchDB per jQuery-Ajax-Call
04. Dezember 2011
Leichtsinnig, wie ich bin, wollte ich per:
auf meine lokale CouchDB zugreifen und konnte es dann auch kaum glauben, als mir nicht das Erhoffte {"couchdb":"Welcome","version":"1.1.0"} zurückgegeben wurde. Warum nicht, was hatte ich vergessen bzw. übersehen? Ein Anfrage diesbezüglich bei den Autoren von "CouchDB - Das Praxisbuch für Entwickler und Administratoren" (Galileo Computing Verlag), die mir übrigens schnell und freundlich von Andy Wenk beantwortet wurde, brachte allerdings auch kein Licht ins Dunkel.
Nach einiger Zeit des erfolglosen Herumprobierens blieb mein Blick (dann endlich) an der Ziel-URL hängen. Genau, das war die Lösung, die SOP (Same Origin Policy) wurde verletzt, Denn der (CouchDB) Port 5984 ist nun mal nicht gleich dem (Standard-Http) Port 80! Manchmal sieht man den Wald vor lauter Bäume nicht.
Die Lösung folgte dann auch auf dem Fuße und nennt sich "Proxy" bzw. "Reverse Proxy". Dazu müssen die Apache-Module mod_proxy.so und mod_proxy_http.so geladen werden und in der Datei httpd.conf Folgendes eingetragen werden:
(Lokal reicht eigentlich schon der Eintrag ProxyPass).
Nun kann man den obigen Aufruf realisieren, indem man die ungültige URL
ersetzt durch
Und siehe da, ich erhielt tatsächlich die erhofften Daten.
$.ajax({
type: "GET",
url: "http://localhost:5984",
contentType: "application/json",
dataType: "json",
complete: function( req ){
if( req.status == 200 ){
alert("Erfolg: " + req.responseText);
}else{
alert("Fehler");
}
}
});
auf meine lokale CouchDB zugreifen und konnte es dann auch kaum glauben, als mir nicht das Erhoffte {"couchdb":"Welcome","version":"1.1.0"} zurückgegeben wurde. Warum nicht, was hatte ich vergessen bzw. übersehen? Ein Anfrage diesbezüglich bei den Autoren von "CouchDB - Das Praxisbuch für Entwickler und Administratoren" (Galileo Computing Verlag), die mir übrigens schnell und freundlich von Andy Wenk beantwortet wurde, brachte allerdings auch kein Licht ins Dunkel.
Nach einiger Zeit des erfolglosen Herumprobierens blieb mein Blick (dann endlich) an der Ziel-URL hängen. Genau, das war die Lösung, die SOP (Same Origin Policy) wurde verletzt, Denn der (CouchDB) Port 5984 ist nun mal nicht gleich dem (Standard-Http) Port 80! Manchmal sieht man den Wald vor lauter Bäume nicht.
Die Lösung folgte dann auch auf dem Fuße und nennt sich "Proxy" bzw. "Reverse Proxy". Dazu müssen die Apache-Module mod_proxy.so und mod_proxy_http.so geladen werden und in der Datei httpd.conf Folgendes eingetragen werden:
ProxyPass /couch http://localhost:5984
ProxyPassReverse /couch http://localhost:5984
(Lokal reicht eigentlich schon der Eintrag ProxyPass).
Nun kann man den obigen Aufruf realisieren, indem man die ungültige URL
$.ajax({
...
url: "http://localhost:5984",
...
});
ersetzt durch
$.ajax({
...
url: "http://couch",
...
});
Und siehe da, ich erhielt tatsächlich die erhofften Daten.
2 Kommentare bisher.
HILFE
Code-Beispiele werden mit den BBCodes [code][/code] dargestellt.
Jedes Tag muss eine Zeile für sich allein haben, d.h der Beispiel-Code
muss wirklich ZWISCHEN den Tags stehen. Beispiel:
Alles was zwischen den beiden Tags [register] und [/register] eingetragen wird, ist nur für registrierte (und eingeloggte) User sichtbar.
[code] ACHTUNG! HIER UMBRUCH WICHTIG. TAG [code] MUSS ALLEIN STEHEN
#include <stdio.h>
int main( void ){
return 0;
} ACHTUNG! HIER UMBRUCH WICHTIG. NACHFOLGENDES TAG [/code] MUSS ALLEIN STEHEN
[/code]Alles was zwischen den beiden Tags [register] und [/register] eingetragen wird, ist nur für registrierte (und eingeloggte) User sichtbar.
Dein Name *
Deine Email
Deine Website
Vorschau
an die URL hatte ich beim drüber gucken nicht gedacht. Klar, wenn Du das Beispiel innerhalb einer Applikation auf Port 80 laufen lässt, kannst Du den Ajax Request nicht einfach absetzen. Deine Lösung ist hier die richtige. Das hätten wir ev. im Buch anmerken sollen.
Ich habe beim Erstellen des Beispiels der Einfachheit wegen einen server in Nginx unter 5984 in der conf eingetragen.
Produktiv solltest Du ev. noch drüber nachdenken, den Proxy-Pass auch für https zu konfigurieren.
Beste Grüße
Andy
danke für Deine Hinweise. Sorry nochmals, ich hätte doch vielleicht genauer darauf hinweisen können, dass ich einen "externen" Ajax Request (auf Port 80) absetzen wollte.
Schöne Grüße,
Matthias