2016-12-09 4 views
1

Meine Angular 1.5.8 Web-Anwendung ist um http://www.example.com/foo/ und meine RESTful Liste von Bars ist um http://www.example.com/foo/api/bars. Wenn ui-router zur Liste der Bars in Angular geht, ist mein Browser unter http://www.example.com/foo/#/bars. Ich möchte einfach eine Verbindung zu einer RESTful-Ressource herstellen, um eine Verbindung zu http://www.example.com/foo/api/bars über HTTP GET herzustellen.

Also versuche ich, die naheliegendste Sache:

$resource("api/bars/") 

In meinem Kopf, dass api/bars/ auf den aktuellen Pfad mir http://www.example.com/foo/api/barhttp://www.example.com/foo/#/bars zu geben, richtig lösen soll? Aber es funktioniert nicht (obwohl ich schwören könnte, es funktionierte mit $http). Stattdessen gibt es mir einen $resource:badcfg Fehler.

Angular lässt mich folgendes tun, aber dies den richtigen Pfad nicht produzieren, sondern gibt mir http://www.example.com/api/bars:

$resource("/api/bars/") 

Also versuche ich $browser.baseHref(), aber das scheint auf die leere Zeichenfolge gesetzt werden (warum ?), http://www.example.com/api/bars wieder produzieren.

$resource($browser.baseHref() + "/api/bars/") 

Ich versuchte $location.path() zu verwenden, aber Angular denkt, dass ich nach dem Rautezeichen, den Pfad will, so dass nicht funktioniert, mir geben. Do!

$resource($location.path() + "/api/bars/") 

Wie kann ich api/bars/ auf den Basispfad der aktuellen URL http://www.example.com/foo/#/bars, produziert http://www.example.com/foo/api/bars (oder auch nur den Pfad) einfach lösen?

Beachten Sie, dass es nicht akzeptabel für mich zu hart Code ist ein absoluter Pfad oder meinen HTML-Code zu ändern. Warum sollte ich? Außerdem wird diese Anwendung an zwei Stellen auf dem gleichen Server (hey, es ist einfach mit Java, Tomcat und JAX-RS), unter http://www.example.com/foo/ und http://www.example.com/foo-demo/. Die Anwendung sollte unter jedem Standort unverändert ausgeführt werden und auf die RESTful-API-Liste der Balken unter http://www.example.com/foo/api/bars bzw. http://www.example.com/foo-demo/api/bars zugreifen.

Dies ist nicht kompliziert; Dies ist eine einfache "URI-Syntax 101", die in RFCs seit über zwei Jahrzehnten beschrieben wurde. Ich möchte einfach api/bars/ in den Basispfad der aktuellen URL http://www.example.com/foo/#/bars auflösen. Wie mache ich das in Angular 1.5?

Antwort

1

OK, es gibt zwei Möglichkeiten, dies zu tun. Wenn Sie unbedingt einen absoluten Pfad möchten, können Sie diese verwenden:

$resource(location.origin + location.pathname + "api/bars/") 

Beachten Sie die Verwendung des location Objekt location.origin das Protokoll, die Domäne und Port zu schaffen; und location.pathname, um den Basispfad einzurichten. (Noch einmal Microsoft wird einen Schraubenschlüssel ins Werk werfen: location.origindoesn't work auf IE11 auf einigen Versionen von Windows 10.)

Aber der bessere Ansatz ist einfach zu bedienen: „Warten Sie, ich dachte, Sie haben gesagt, das du einen Fehler geben“

$resource("api/bars") 

du könntest ausrufen. Nun, es stellt sich heraus, dass ich mich geirrt habe. Ich bekam tatsächlich einen Fehler, aber es war, weil ich die Accept Kopfzeile nicht gesetzt hatte, um um JSON zu bitten, und die plain/text Antwort, die ich erhielt (das ist der Standard auf meiner RESTful Ressource), war verwirrend $resource. Es stellt sich heraus, dass ein relativer URI funktioniert.

+0

Das ist in Ordnung und es hat auch eine wertvolle Information, dass nicht nur das Array-Objekt-Problem ein Grund für den Fehler sein kann, den Sie erhalten haben. –

1

Es ist möglich, relative Pfadsyntax für $resource zu verwenden, wie Sie es mit $http verwenden können, das von $resource verwendet wird. Dies kann durch Weglassen des führenden Schrägstrichs (wie Sie vorgeschlagen haben) oder durch Voranstellen der Ressource mit ./ erfolgen.

Ihr badcfg Fehler scheint eher der Fall zu sein, weil Ihre Anfrage korrekt funktioniert, aber die Serverantwort nicht den Erwartungen entspricht. Sie geben also wahrscheinlich ein einzelnes Objekt anstelle eines Arrays zurück. Bitte benutzen Sie die dev tools, um zu debuggen, was wirklich vom Server zurückgegeben wird.

Siehe die docs on $resource für Details.

+0

Sie hatten Recht in allen Punkten ... aber Sie scheinen Ihre Antwort gerade eingegeben zu haben, als ich meins getippt habe, also haben Sie meinen Beitrag nicht gesehen. Zwei Minuten zuvor und du hättest mich dazu geschlagen. ;) Ich würde immer noch deine als die richtige Antwort bezeichnen, weil du zu all dieser Arbeit gegangen bist, aber meine Antwort notiert eine Lösung für das Erstellen eines absoluten, aufgelösten Pfades. Vielen Dank, dass Sie Ihre korrekte und kompetente Antwort gefunden haben. –