2016-12-09 2 views
1

Мое Угловое 1.5.8 веб-приложение находится на http://www.example.com/foo/, а мой список RESTful - на http://www.example.com/foo/api/bars. Когда ui-router переходит в список баров в Angular, мой браузер находится в http://www.example.com/foo/#/bars. Я просто хочу подключиться к ресурсу RESTful для подключения к http://www.example.com/foo/api/bars с использованием HTTP GET.

Так что я стараюсь наиболее очевидную вещь:

$resource("api/bars/") 

В моей голове, что следует разрешить api/bars/ на пути тока http://www.example.com/foo/#/bars дать мне http://www.example.com/foo/api/bar, верно? Но это не работает (хотя я мог бы поклясться, что это сработало с $http). Вместо этого он дает мне ошибку $resource:badcfg.

Угловая позволяет мне сделать следующее, но это не дает правильный путь, вместо того, чтобы дать мне http://www.example.com/api/bars:

$resource("/api/bars/") 

Так я пытаюсь $browser.baseHref(), но кажется, что должен быть установлен в пустую строку (почему ?), снова производя http://www.example.com/api/bars.

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

Я пытался использовать $location.path(), но Угловой думает, что я хочу путь после диеза, так что не работает, давая мне . Doh!

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

Как я могу просто решить api/bars/ на базовый путь текущего URL http://www.example.com/foo/#/bars, производя http://www.example.com/foo/api/bars (или даже просто по пути)?

Обратите внимание, что это не приемлемо для меня, чтобы жесткий код был абсолютным путем, или чтобы изменить код HTML. Почему я должен? Кроме того, это приложение будет установлено в двух местах на одном сервере (эй, это легко с Java, Tomcat и JAX-RS), на http://www.example.com/foo/ и http://www.example.com/foo-demo/. Приложение должно запускаться без изменений под каждым местоположением, получая доступ к списку RESTful API в барах по http://www.example.com/foo/api/bars и http://www.example.com/foo-demo/api/bars, соответственно.

Это не сложно; это простой «синтаксис 101 URI», который уже более двух десятилетий описан в RFC. Я просто хочу разрешить api/bars/ базовому пути текущего URL-адреса http://www.example.com/foo/#/bars. Как это сделать в Angular 1.5?

ответ

1

ОК, есть два способа сделать это. Если вы абсолютно хотите абсолютный путь, вы можете использовать это:

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

Обратите внимание на использование объекта locationlocation.origin установить протокол, домен и порт; и location.pathname, чтобы установить базовый путь. (Еще раз Microsoft бросит ключ в свои работы: location.origindoesn't work на IE11 в некоторых версиях Windows 10.)

Но подход лучше просто использовать: «Подождите, я думал, вы сказали, что это даст вам ошибку»

$resource("api/bars") 

вы можете воскликнуть. Ну, оказывается, я ошибся. Я действительно получал ошибку, но это было из-за того, что я не задал заголовок Accept для запроса JSON, а ответ plain/text, который я получал (это значение по умолчанию для моего ресурса RESTful), вводит в заблуждение $resource. Оказывается, что относительный URI будет работать в конце концов.

+0

Это прекрасно, и у него также есть ценная информация, что причиной ошибки может быть не только проблема с массивом и объектами. –

1

Можно использовать синтаксис относительного пути для $resource, поскольку вы можете использовать его с $http, который используется $resource. Это можно сделать, опуская ведущую косую черту (как вы сказали) или префикс ресурса ./.

Ошибка вашей ошибки badcfg, скорее всего, будет иметь место, потому что ваш запрос работает правильно, но ответ сервера не соответствует ожиданиям. Поэтому, возможно, вы возвращаете один объект вместо массива. Пожалуйста, используйте инструменты dev, чтобы отлаживать то, что действительно возвращается с сервера.

Подробнее см. В docs on $resource.

+0

Вы были правы во всех отношениях ... но вы, кажется, печатали свой ответ так же, как я печатал мой, так что вы не видели моего сообщения. Две минуты раньше, и вы бы избили меня. ;) Я бы по-прежнему отмечал ваш как правильный ответ, потому что вы пошли на все эти работы, но мой ответ замечает решение для создания абсолютного, разрешенного пути. Спасибо, что задумался над вашим правильным и компетентным ответом. –